Interstage Application Server配下のJavaアプリケーション実行時において、以下のメッセージが出力された場合は、メモリ領域不足事象が原因による異常となります。
Javaヒープをチューニングしてください。
Javaヒープのチューニング方法は、“8.4.1 Javaヒープのチューニング”を参照してください。
EXTP4435メッセージ
ISJEE_OM1018メッセージ
各メッセージの内容については、“メッセージ集”を参照してください。
なお、IJServerのコンテナ情報ログ(info.log)およびIJServerクラスタのJava VMログ(jvm.log)に出力される「Java VMのヒープ域不足の詳細情報」の出力形式は、図1のとおりです。
図1 Java VMのヒープ域不足の詳細情報の出力形式
------------------------------------------------------------------ |
process_id: | メモリ領域不足事象が発生したJavaプロセスのプロセス番号。 |
heap_type_code: | メモリ領域不足事象が発生した領域に対応する番号です。表示される番号については、heap_typeの説明を参照してください。 |
heap_size: | メモリ領域不足事象が発生した際に使用中となっているメモリ割り当てプールのサイズ(単位:byte)。 |
max_heap_size: | 利用可能なメモリ割り当てプールの最大サイズ(単位:byte)。 |
perm_size: | メモリ領域不足事象が発生した際に使用中となっているPermanent世代領域のサイズ(単位:byte)。 |
max_perm_size: | 利用可能なPermanent世代領域の最大サイズ(単位:byte)。 |
requested_size: | 領域不足となったオブジェクトの要求サイズ(単位:byte)。 |
heap_type: | 不足領域情報(メモリ領域不足事象が発生した領域の名前など)を表示します。
|
stack_trace: | メモリ領域不足事象が発生したスレッドがJavaアプリケーションを実行しているスレッドだった場合は、当該スレッドのスタックトレースが出力されます。それ以外のスレッドの場合、またはリソース不足によりスタック情報が取り出せない場合は、スタックトレースは出力されません。 |
メモリ領域不足事象が発生した際に出力される各領域の使用中サイズ(heap_size、perm_size)には、メモリ領域不足の原因となったオブジェクトの大きさは含まれません。
そのため巨大サイズのオブジェクト生成要求などによりメモリ領域不足事象が発生した場合には、「最大サイズ」と「使用中サイズ」の差が大きい場合(空き領域がたくさんあるように見える場合)がありますので注意してください。
NewGC処理では、New世代領域を「eden space」、「from space」および「to space」の3つの内部領域に細分割し、当該領域上において、一般に世代別GC制御と言われる制御方法を用いて、Javaアプリケーションが生成要求したオブジェクトを管理・制御しています。
このうち、「from space」および「to space」は、Java VMがNewGC処理を行う際の作業域的な役割を持つ領域となっています。そのため、「from space」および「to space」の各領域が占める大きさのうち、Javaアプリケーションからのオブジェクト生成要求のために使用される大きさは、その領域の一部分だけとなります。
そのため、出力データにおいて、メモリ割り当てプールやNew世代領域に空きがあるように見える場合であっても、実際には空きがない場合がありますので注意してください(空きがあるように見える場合であっても、その差は、NewGC処理用の作業域的な役割で使用済となっている場合があります)。
メモリ割り当てプールに対してメモリ領域不足事象が発生した場合に出力されるheap_sizeの値は、New世代領域での使用中サイズとOld世代領域での使用中サイズの合計値です。
New世代領域とOld世代領域は別々のオブジェクト格納域として管理・制御されますから、max_heap_sizeとheap_sizeの差の大きさが、そのまま生成要求できるオブジェクトの最大サイズにはなりませんので注意してください。
図2 Java VMのヒープ域不足の詳細情報の出力例
-------------------------------------------------------------------------------- OutOfMemory Log -------------------------------------------------------------------------------- pid=4696 heap_type=1 heap_size=136800 max_heap_size=6291456 perm_size=2052320 max_perm_size=67108864 requested_size=40000016 -------------------------------------------------------------------------------- VM is terminated by occurred OutOfMemoryError on Java heap. "main" prio=6 tid=0x00307000 nid=0x12a8 runnable [0x0092f000] java.lang.Thread.State: RUNNABLE at test.<init>(test.java:10) at test.main(test.java:5) |
JDK/JRE 6からスタックトレース情報にスレッドの状態を表す情報(トレース情報の前の行)が表示されるようになりました。
図中の例では「java.lang.Thread.State: RUNNABLE」となっていますが、"RUNNABLE"の部分が、"NEW"、"TIMED_WAITING (sleeping)"、"WAITING (on object monitor)"、"TIMED_WAITING (on object monitor)"、"WAITING (parking)"、"TIMED_WAITING (parking)"、"BLOCKED (on object monitor)"、"TERMINATED"、"UNKNOWN"などの表示の場合があります。