2013/06/30

Javaの"ヒープ"を簡単にまとめてみた

■Javaにおけるヒープとは

ヒープメモリとは、簡単に言うとJavaVM上で起動するJavaプログラムのリソースを管理する領域です。

構造は以下のようになっています。

1.New領域= 新規オブジェクトが格納される領域の総称
 1-1.Eden領域= 新規オブジェクトが格納される領域
 1-2.From/To領域= Scavenge GC時に使用中のオブジェクトが格納される領域(Survivor領域)
2.Old領域= 古いオブジェクトがNew領域からScavenge GCによって移動される領域
3.Permanent領域= クラスやメソッドが格納される領域
4.Cヒープ領域= JavaVM自身が使用する領域


■ガベージ・コレクション

ガベージ・コレクションとはヒープメモリ上にある不要な情報を解放する処理です。
空き容量が不足した際にJavaVMが自動的に行います。


Scavenge GC= NEW領域のみを対象としたガベージ・コレクション
   New領域が不足した際に実行される。
   最初にEden領域からTo領域に移動させ、不使用オブジェクトは破棄する。
   2回目にTo領域からFrom領域に移動させる。From⇔Toを繰り返す。
   この移動回数が閾値を超えると、Old領域に移動する。
  
Full GC= NEWとOLD両方の領域を対象としたガベージ・コレクション
   Old領域が不足した際に実行される。
   処理が重く、実行中はシステムが一時的に停止する。



■JavaVMオプション

-Xms=ヒープメモリ全体の起動時のサイズ
-Xmx=ヒープメモリ全体の最大サイズ
-Xmn=New領域の初期サイズ
-XX:MaxNewSize=New領域の最大サイズ
-XX:PermSize=Permanent領域の初期サイズ
-XX:MaxPermSize=Permanent領域の最大サイズ

-XX:NewRatio=New領域とOld領域の比率
-XX:SurvivorRatio=Eden領域とSurvivor領域の比率
-XX:MaxTenuringThreshold=New領域内でGCされた回数で、この閾値を超えるとOld領域
 に移動させられる

-verbose:gc=GC情報を出力する
-Xloggc:filename=GC情報をファイルfilenameに保存
-XX:+PrintGCDetails=New領域、Old領域の詳細を出力
-XX:+PrintTenuringDistribution=オブジェクトの寿命の情報
-XX:+PrintHeapAtGC=GC前後のヒープ領域の情報
-XX:+TraceGen0Time=New領域のGCの回数、総時間、平均時間
-XX:+TraceGen1Time=Old領域のGCの回数、総時間、平均時間



以下のサイトを参考にさせてもらいました。
http://www.atmarkit.co.jp/ait/articles/0504/02/news005.html
http://d.hatena.ne.jp/tanakakns/20120508/1336467306
http://www.whitemark.co.jp/tec/java/javagc.html


今後仕事でFull GCが発生しているJavaアプリのチューニングをしていく予定なので、
チューニングテクニックなどを勉強した際にはまたアップしたいと思います。

0 件のコメント:

コメントを投稿