OutOfMemoryError : Java heap spaceが発生した場合の対処方法

Java heap spaceエラーはJVMのヒープ領域(heap space)が不足した場合に発生します。プログラムに問題がある場合は、メモリリークやボトルネックになっている箇所を調査しますが、ここではプログラムに問題がない場合とします。

対処としてはヒープ領域(heap space)へのメモリ割り当て量を増やすことになります。

ヒープ領域とは

JVMが実行時に生成するオブジェクトへ割り当てる領域をヒープ領域といいます。

ヒープ領域の設定

eclipseの場合、eclipse.iniに定義するか「メニュー(ウィンドウ)」→「設定」→「Tomcat – JVM設定」を開き、JVMパラメーターを設定します。

このほかにPermanent領域がありますがこれも上記のように設定できます。これは永続的に参照するオブジェクトを管理するヒープ領域の1つです。

デフォルト・ヒープ・サイズについて

デフォルト・ヒープ・サイズ
コマンド行で初期ヒープ・サイズと最大ヒープ・サイズが指定されていない場合、これらのサイズはマシン上のメモリー容量に基づいて計算されます。

クライアント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

引用:デフォルトヒープサイズ

スポンサードリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください