かわばたのAndroidブログ

Androidとかマテリアルデザインとかオープンソースとか

【Java】JVMとは…まとめ

普段何気なく、「JVMが…メモリが…」などと言っているが、その中身をぼんやりとしか理解していなかったのでこれを機にまとめておく。

JVMの中身

JVMは以下の3つの領域に分けられている。
・New領域
・Old領域
・Permanent領域

ひとつずつまとめていく。

New領域

新しいオブジェクトを格納する領域。
更に以下の3つに分類される
・Eden領域 … オブジェクトのインスタンスがはじめて格納される領域
・From領域 … Scavenge GC時の退避領域
・To領域 … Scavenge GC時の退避領域

Eden領域が一杯になるとScavenge GCが実行される。

Scavenge GC

Eden領域内の不要なオブジェクトは破棄される。
他のオブジェクトから参照されているオブジェクトはTo領域に配置される。
To領域のオブジェクトはFrom領域へ移動する。
From領域のオブジェクトはTo領域へ移動する。
From〜Toを32回移動したオブジェクトはOld領域へ移動する。

Old領域

長期間滞在するオブジェクトが配置される領域。
このOld領域が一杯になるとFull GCが起きる。

Full GC

すべての領域を対象に不要なオブジェクトを破棄する。
大規模で行われるため時間がかかる。
極力生じないことが好ましい。

Permanent領域

ロードされたclassなどが格納される領域。
なのでメモリ使用量は大体J2EEサーバーにロードされるクラスファイルの合計サイズになる。


以下のサイトを参考にさせて頂きました。
http://www.atmarkit.co.jp/ait/articles/0504/02/news005_2.html
http://d.hatena.ne.jp/ogin_s57/20120623/1340463194
http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0950/03Y0440D/EY040159.HTM