Java > メモリ管理
更新日
2012-05-15
広告
Javaのメモリ管理について簡単にまとめます。
Javaアプリケーションが利用するメモリは、主に
- Javaヒープ領域
- Permanent領域
Permanent領域には、Javaのクラスやメソッドなどのメタデータが格納されます。非常に多くのJavaクラスをロードした場合に、まれにPermanent領域が不足する場合がありますが、たいていの場合は大丈夫でしょう。
Javaヒープ領域には、Javaアプリケーションが生成したオブジェクトが格納されます。こちらの記事で紹介したように、-Xmxオプションや-Xmsオプションで調節できるのは、このJavaヒープ領域になります。
Javaヒープ領域の中には、New領域とOld領域があります。また、New領域の中には、Eden領域とSurvivor領域があります。さらに、Survivor領域の中には、from領域とto領域があります。ディレクトリ構造っぽく書くと、以下のようになります。
Javaヒープ領域 +-- New領域 | +-- Eden領域 | +-- Survivor領域 | +-- from領域 | +-- to領域 +-- Old領域このようにJavaヒープ領域が細かく分かれているのは、ガーベージコレクション(GC: Garbage Collection)のためです。
以下、GCの処理の説明に合わせて、各領域の使い方を説明します。
- 生成されたばかりのオブジェクトは、Eden領域に格納されます。
- Eden領域がいっぱいになると、Copy GCが発生します。Copy GCはNew領域(Eden領域, from領域, to領域)が対象です。
- Copy GCでは、from領域からto領域へ(もしくは、その逆へ)、オブジェクトをコピーしながら、不要なオブジェクトを削除します。Eden領域のオブジェクトもコピーします。
- 今回、from領域からto領域へコピーしたら、次のCopy GCのときは、to領域からfrom領域へのコピーとなります。つまり、生成されてから、ある程度利用されているオブジェクトは、from領域とto領域を行ったり来たりすることになります。
- 何度もコピーされたオブジェクトは、Old領域にコピーされます。
- Old領域がいっぱいになると、Full GCが発生します。Full GCは、全領域を対象として、不要なオブジェクトを削除します。Full GCのとき、Javaアプリケーションの動作は止まります。
広告
お問い合わせは sweng.tips@gmail.com まで。