[java] メモリ領域とガベージコレクション

■メモリの呼び名

Java のオブジェクトは、大きく分けて以下の3つのメモリ領域で管理される。

・New領域(ヒープ領域)
新しいオブジェクトが管理される。
New領域が新しいオブジェクトで一杯になると、Scavenge GCが行われて、使用されていないオブジェクトは破棄されたり別の領域に移動されたりする。

・Old領域(ヒープ領域)
古いオブジェクトが管理される。New領域で生き残ったオブジェクトが配置される。

・Permanent領域(非ヒープ領域)
クラスやメソッドの情報が格納される。

■ガベージコレクション(GC)

GCとは、ヒープ領域に空きが少なくなった時に、不要なオブジェクトを除去してメモリの空き領域を増加させてくれる処理。

Java プログラムが動作するとオブジェクトはメモリ上にロードされるため、 大きなオブジェクトを使用したり、また、使用するオブジェクトの数が多かったりすると、その分メモリの使用領域は増加する。

そのまま、新しいオブジェクトをロードし続ける と、Java が使用できるメモリ領域が一杯になる。 これを解消するために自動的に行われるメモリ掃除の仕組みがGCである。

GCには大きく以下の2つがある。

・Scavenge GC
New 領域が不足した場合に実行され、主に New 領域が対象。
比較的、頻繁に行われ、短時間で終了する。軽い。

・FULL GC
New領域、Old領域、Permanent領域全てが対象。重い。
Full GC が行われている間は、他の処理ができずアプリは待たされる。

メモリサイズにもよるが、FULL GCは数秒程度?

■設計指針

当たり前だが、、、
・メモリサイズが小さすぎると、Out of Memoryエラーのリスクが高くなる。
・メモリサイズを大きすぎると、いざFULL GCが必要となった場合の負荷が高くなる。

実行するアプリケーションにあわせて、各メモリ領域のサイジングを行う必要がある。

製品マニュアルなどの推奨値などを参考に暫定値を割り当てた上で、実際の使用状況を確認してチューニングするのが良いのかな。

各メモリ領域(New, Old, Permanent)の使用状況は、jstatコマンド等で確認できる。

■参考

とても参考になったサイト

・「Java のヒープサイズ」についての簡単な説明
http://www.whitemark.co.jp/tec/java/javaHeap.html

・ガーベジ・コレクション:GC ( Garbage Collection ) についての簡単な説明と調査方法
http://www.whitemark.co.jp/tec/java/javagc.html

・[Java][GC][チューニング][トラブルシューティング]Javaメモリ、GCチューニングとそれ にまつわるトラブル対応手順まとめAdd Star
http://d.hatena.ne.jp/learn/20090218/p1

Javaの絵本―Javaが好きになる9つの扉 Javaの絵本―Javaが好きになる9つの扉
アンク

翔泳社 2002-12
売り上げランキング : 395611

Amazonで詳しく見る by G-Tools

[Windows] バッチコマンドでのファイル結合と追記

■copyコマンド

(1) 単一ファイルのコピー
copy コピー元ファイル名 コピー先ファイル名

(2) 複数ファイルを結合してコピー
copy コピー元ファイル名1+コピー元ファイル名2 コピー先ファイル名

(3) ワイルドカード指定でコピー
copy *.txt コピー先ファイル

※制限事項
ディレクトリでのワイルドカードは指定できない。
上書きの有無は指定できるが、追記は出来ない。

⇒copyコマンドは、複数ディレクトリにある複数ファイルの操作とは相性よくない。

■typeコマンド

ディレクトリでワイルドカード指定できないのはcopyコマンドと同じだけど、追記が可能。

(1) ワイルドカード指定で追記
type *.txt >> コピー先ファイル名
type *.log >> コピー先ファイル名

Windows コマンドプロンプト ポケットリファレンス Windows コマンドプロンプト ポケットリファレンス
山近 慶一

技術評論社 2011-12-09
売り上げランキング : 75750

Amazonで詳しく見る by G-Tools

[Linux] デバッグ用にgdb をインストールしてみた。

色々とデバッグしてみたくなったので、巷で話題のgdbコマンドをインストールしてみた。

■ファイル入手先
http://www.gnu.org/software/gdb/

ここから最新バージョン(7.5)をダウンロード。

■手順メモ

# tar zxvf gdb-7.5.tar.gz
# cd gdb-7.5
# ./configure
# make
# su
# make install

# [root@red gdb-7.5]# which gdb
/usr/local/bin/gdb

[root@red gdb-7.5]# gdb -v
GNU gdb (GDB) 7.5

時間は5分程度。

デバッグの理論と実践 ―なぜプログラムはうまく動かないのか
Andreas Zeller 中田 秀基

デバッグの理論と実践 ―なぜプログラムはうまく動かないのか
オライリージャパン 2012-12-22
売り上げランキング : 283552

Amazonで詳しく見る by G-Tools

[用語] コンテキストスイッチ

wikipediaより

コンテキストスイッチ (context switch) とは、複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト)を保存したり復元したりする過程のことである。

コンテキストスイッチはマルチタスクオペレーティングシステムに不可欠な機能である。

通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。