Javaのメモリ管理について
Posted in: JavaITProの記事がわかりやすかったので。自分で要約してみた。
第1回 ヒープがどのくらい使われているかを理解する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060605/239936/?ST=ittrend
★Javaではメモリーを複数の領域に分割して管理している
・クラス定義やメソッドなどのデータが格納されるPermanent領域
・インスタンスが割り当てられるヒープ領域
★ ヒープの使用量を知る
・J2SE 1.4以前の場合
java.lang.Runtimeクラスを使用
・Java SE 5.0
java.lang.management.MemoryMXBeanクラスを使用(より詳細な情報を取得できる)
init:Java VMが起動時にOSに要求するメモリー量。設定されていない場合、0になる
used:現在使用しているメモリー量
committed:Java VMが現在使用することを保証しているメモリー量。メモリーの使用状況により増減するが、必ずused以上、max以下になる
max:Java VMが使用できる最大メモリー量
ヒープの場合、initはjavaの起動オプションの-Xmsに相当し、maxは-Xmxに相当
JDKに付属しているjconsoleでヒープ使用量などを見ることができる。
第2回 GCの仕組みを理解する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060612/240657/?ST=ittrend
★GCの発生頻度を調べる
javaの起動オプションに-verboseを使用する
(-verboseだけだとクラスローディングやネイティブライブラリの使用に関する情報も表示されてしまうので、GCだけに特化したいときには-verbose:gcとする)
> java -verbose:gc -jar Java2Demo.jar
★ヒープメモリの構成
・Young領域(Eden領域と2つのSurvivor領域からなる)
・Old領域(Tenured領域)
★HotSpot VMでのヒープ管理
HotSpot VMではインスタンスの寿命(GCから生き残った回数)を元にヒープを管理している
Young領域とOld領域でそれぞれ異なるGC手法を用いて管理している
★GCの種類
・GC(Scavenge GC)
ヒープのYoung領域に対するGC
Scavenge GCはオブジェクトを移動させるだけなのでCopy GCとも呼ばれ、高速にGCを行うことができる
・Full GC(Mark & Sweep GC)
ヒープ全体を対象にしたGCなので、通常のGCに比べて時間がかかる
★GCのしくみ
リンク先の図がわかりやすいので割愛
第3回 ヒープのチューニング
http://itpro.nikkeibp.co.jp/article/COLUMN/20060619/241190/?ST=ittrend
★チューニングポイント
・GCの頻度をなるべく抑えられるようにする。(特にFull GCは時間がかかるので、必要最低限になるようにする)
・寿命の短いインスタンスを大量に生成している場合は、Young領域が逼迫しTenured領域まで寿命の短いインスタンスが占めることになってしまい、Full GCの頻度が高くなってしまう。このような場合は、Young領域のサイズを大きくすることで、Full GCの発生を抑えることができる。
★HotSpot VMのオプション
-Xms 起動時のヒープサイズ
-Xmx 最大のヒープサイズ
-Xmn Young領域のサイズ
-XX:NewRatio Young領域とOld領域の比率
-XX:SurvivorRatio Eden領域とSurvivor領域の比率
★エルゴノミクスの機能拡張
Java SEのバージョンが5.0以上であれば自動調整してくれる




