Java heap spaceエラーはJVMのヒープ領域(heap space)が不足した場合に発生します。プログラムに問題がある場合は、メモリリークやボトルネックになっている箇所を調査しますが、ここではプログラムに問題がない場合とします。
対処としてはヒープ領域(heap space)へのメモリ割り当て量を増やすことになります。
ヒープ領域とは
JVMが実行時に生成するオブジェクトへ割り当てる領域をヒープ領域といいます。
ヒープ領域の設定
eclipseの場合、eclipse.iniに定義するか「メニュー(ウィンドウ)」→「設定」→「Tomcat – JVM設定」を開き、JVMパラメーターを設定します。
1 |
設定例:-Xms128m -Xmx768m |
このほかにPermanent領域がありますがこれも上記のように設定できます。これは永続的に参照するオブジェクトを管理するヒープ領域の1つです。
1 |
設定例:-XX:PermSize=128m -XX:MaxPermSize=256m |
デフォルト・ヒープ・サイズについて
デフォルト・ヒープ・サイズ
コマンド行で初期ヒープ・サイズと最大ヒープ・サイズが指定されていない場合、これらのサイズはマシン上のメモリー容量に基づいて計算されます。クライアントJVMのデフォルト・ヒープ・サイズの初期値と最大値
デフォルトの最大ヒープ・サイズは、物理メモリーの半分(最大で192MBの物理メモリー・サイズまで)、それ以外の場合、物理メモリー・サイズの1/4 (最大で1GBの物理メモリー・サイズまで)です。たとえば、マシンの物理メモリーが128MBの場合の最大ヒープ・サイズは64MB、物理メモリーが1GB以上の場合の最大ヒープ・サイズは256MBになります。
最大ヒープ・サイズは、それを必要とするだけのオブジェクトが作成される場合を除き、実際にはJVMによって使用されません。初期ヒープ・サイズと呼ばれる、はるかに少ない量がJVMの初期化時に割り当てられます。この容量は少なくとも8MB、およびそれ以外の場合、物理メモリーの1/64 (最大で1GBの物理メモリー・サイズまで)です。
若い世代に割り当てられる最大領域サイズは、全ヒープ・サイズの1/3です。
サーバーJVMのデフォルト・ヒープ・サイズの初期値と最大値
サーバーJVM上のデフォルト・ヒープ・サイズの初期値と最大値は、より高いデフォルト値が可能であることを除き、クライアントJVMの場合と同様です。32ビットJVMのデフォルトの最大ヒープ・サイズは、4GB以上の物理メモリーがある場合、最大で1GBです。64ビットJVMのデフォルトの最大ヒープ・サイズは、128GB以上の物理メモリーがある場合、最大で32GBです。これらの値は、いつでも直接に指定して、より高い(または低い)初期および最大ヒープを設定できます。次の項を参照してください。ヒープ・サイズの初期値と最大値の指定
フラグ-Xms (初期ヒープ・サイズ)および-Xmx (最大ヒープ・サイズ)を使用して、初期および最大のヒープ・サイズを指定できます。アプリケーションがうまく動作するために必要なヒープ領域がわかっている場合は、-Xmsと-Xmxを同じ値に設定できます。そうでない場合は、JVMが初期ヒープ・サイズを使用して開始され、ヒープ使用量とパフォーマンスのバランスが取れるまで、Javaヒープが増加します。これらのデフォルト値は、他のパラメータおよびオプションの影響を受ける場合があります。デフォルト値を確認するには、-XX:+PrintFlagsFinalオプションを使用し、出力からMaxHeapSizeを探します。たとえば、LinuxまたはSolarisでは、次を実行できます。
java -XX:+PrintFlagsFinal -version | grep MaxHeapSize