「Java のヒープサイズ」についての簡単な説明
技術情報 TOP へ

Java のヒープ領域及び 非ヒープ領域、メモリ管理について簡単に説明いたします。

ヒープやヒープサイズはガーベジ・コレクション:GC ( Garbage Collection ) と密接な関連があります。以下のページも合わせて参照ください。

ガーベジ・コレクション:GC ( Garbage Collection ) についての簡単な説明と調査方法


Java のオブジェクトは、大きく分けて、New、Old 、Permanent というメモリ領域で管理されます。 新しいオブジェクトを格納するのが New 領域と呼ばれ、古いオブジェクトを格納するのが Old 領域と呼ばれます。 Permanent 領域にはクラスやメソッドなどの情報が格納されます。
( これらは Permanent Generation, Tenured Generation, Young Generation とも呼ばれます。)

以下にそれぞれの簡単な説明を記述します。

( 1 ) New 領域 ( Young Generation ) :ヒープ領域

New 領域は、Eden 、From 、To ( From と To は Survivor とも呼ばれます。 ) の 3つの領域に分かれています。プログラム実行中にオブジェクトが新たに作成されると、そのオブジェクトは、まず Eden 領域に配置されます。

Eden 領域が新しいオブジェクトで一杯になると、 Scavenge GC ( 簡単に説明すると New 領域に対するガーベジ・コレクション:GC ) により使用されていないオブジェクトは破棄されたり、 使用されているオブジェクトは From 領域と To 領域を移動したりします。

これを数回繰り返し 、ここで使用頻度が高いと判断された( MaxTenuringThreshold の値の回数、デフォルトは 32 回 ) オブジェクトは破棄されず生き残ることになります。

New 領域が不足すると Scavenge GC が頻繁に行われます。


( 2 ) Old 領域 ( Tenured Generation もしくは Old Generation とも呼ばれます ) :ヒープ領域

上記の ( 1 ) で生き残ったオブジェクトが配置されます。つまり寿命の長いオブジェクトがこの領域に配置されます。

Old 領域が一杯になると Full GC ( 重い GC 処理 ) が行われます。


( 3 ) Permanent 領域 ( Permanent Generation ) :非ヒープ領域

クラスやメソッドの情報が格納されます。

大量のクラスをロードする場合や、また、JSP を大量に使用する場合など Permanent 領域 のサイズを大きくする必要があります。

Permanent 領域 が不足しても Full GC ( 重い GC 処理 ) が行われます。

* 上記で説明した ヒープ領域及び 非ヒープ領域が不足すると Full GC ( Full GC が行われている間はシステムの処理がほぼ停止するのでパフォーマンスが悪化します ) が頻繁に走ったり、 OutOfMemoryError が発生したり ( JVM が使用できるメモリが不足して処理が続行できない状態となります ) 、 システムにとって問題が発生する可能性があります。
上記のヒープ領域や Permanent 領域の設定を行うには Java 起動オプションを指定します。

以下に例を挙げます。それぞれ値は下記のように指定します。( m はMB です。 )
例 :
-Xms512m -Xmx512m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:PermSize=64m -XX:MaxPermSize=64m
上記の値の説明は下記を参照してください。

-Xmsヒープ全体の初期値
-Xmsヒープ全体の最大値
-XX:NewSizeNew 領域の初期値
-XX:MaxNewSizeNew 領域の最大値
-XX:PermSizePermanent 領域の初期値
-XX:MaxPermSizePermanent 領域の最大値

・各値は 1024 の倍数に設定します。 ( 1 MB より大きな値であること )

・パフォーマンスに有利に働くように各値の初期値は、各値の最大値と同じ大きさに設定し、 JVM がヒープを増加させる処理が発生することを極力に抑えるようにします。

・NewSize は、最大ヒープ サイズの 1/4 から 1/2 の間で設定することが一般的となります。短命なオブジェクトが多いシステムでは、 NewSize を大きくする必要があります。

各領域の比率についてのヒープサイズオプションとしては下記があります。

-XX:NewRatioNew 領域と Old 領域の比率
-XX:SurvivorRatioNew 領域と Survivor 領域の比率


他にも多数のヒープサイズオプションが存在し、以下のドキュメントに詳細な記述があります。

・Java HotSpot VM Options
http://java.sun.com/docs/hotspot/VMOptions.html

以下の Frequently Asked Questions にも設定例や注意点などの記述がありますので併せて確認しておきます。

以下のドキュメントでは JRE 1.4.2_* 系の Client JVM の Permanent のデフォルト値は PermSize が 4MB ( Server JVM は 16 MB )、MaxPermSize が 64 MB となっています。

・Frequently Asked Questions
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html


JRE 1.4.2_* 系の JVM の ヒープサイズのデフォルト値は -Xms が 2MB 、-Xmx が 64 MB となっています。
( New 領域のデフォルト値は )

・java - the Java application launcher
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html

設定値についてはシステムごとに相違がありますので、具体的な値は記述できませんが、 適切なヒープサイズを設定するのであれば試行錯誤が必要になるかもしれません。
技術情報 TOP へ


Google
WWW を検索 whitemark.co.jp を検索
[ 株式会社ホワイトマーク TOP ]   [ 免責事項 ]

Copyright © 2006 by WhiteMark, All rights Reserved. Last Modified: 2006/05