■メモリの呼び名
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