Java > メモリ管理

更新日 2012-05-15
広告
Javaのメモリ管理について簡単にまとめます。
Javaアプリケーションが利用するメモリは、主に
  • Javaヒープ領域
  • Permanent領域
の2つに分類できます。
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 まで。
inserted by FC2 system