Interstage Application Server トラブルシューティング集 |
目次
索引
![]() ![]() |
第19章 Java実行環境運用時の異常 |
Javaアプリケーション実行時にOutOfMemoryErrorが発生した場合、次の原因が考えられます。
通常、OutOfMemoryErrorは、このケースで発生します。
Javaの使用するメモリは大別すると次の3つに分かれます。
ヒープ域以外にシステムの仮想メモリが不足した場合にもOutOfMemoryErrorが発生します。このような場合、仮想メモリを増やすように変更をお願いします。
なお、仮想メモリが不足してスレッドが生成できない場合、OutOfMemoryErrorに次の情報が付加されます。
java.lang.OutOfMemoryError: unable to create new native thread
ヒープ域やシステムの仮想メモリに余裕がある場合でも、OSによってプロセスごとに決められたメモリの上限に達してOutOfMemoryErrorが発生することがあります。特に、スレッドが生成されると、ヒープ域とは別の領域にメモリが確保されます。大量にスレッドが生成された場合などには、確保量がOSによる上限に達することによってThread生成に失敗し、次の情報が付加されたOutOfMemoryErrorが発生することがあります。
java.lang.OutOfMemoryError: unable to create new native thread
このような場合、以下のように対処してください。
New世代領域とOld世代領域はインスタンスや配列などのオブジェクトを管理する領域です。領域がNew世代とOld世代に分かれるのは、世代別にガーベッジコレクション(GC)の処理を実行するためです。
New世代領域は寿命の短いオブジェクトを管理します。通常、Javaプログラムで生成要求されたオブジェクトはNew世代領域に生成されます。
一定期間New世代領域で生存したオブジェクトはOld世代領域に移動されます。
Old世代領域に存在する不要となったオブジェクトはFullGCによって回収されます。
New世代領域とOld世代領域を合わせたメモリサイズはJava起動時に指定する"-Xmx"オプションによって決まります。デフォルト値は64MBです。
New世代領域とOld世代領域が不足した場合(オブジェクト数が多い場合)、Xmxオプションを使ってヒープ域の最大値を大きくしてください。Xmxオプションは、Interstage管理コンソールのJavaVMオプションで指定します。
実際に、ヒープ域をどの程度使用しているか参照するには、GCの"-verbose:gc"オプションを設定します。
“-verbose:gc"オプション指定時の出力例
---------------------------------------------------------------------- [GC 80229K->31691K(259776K), 0.4795163 secs] [FullGC 57654K->4623K(259776K), 0.3844278 secs] (1) (2) (3) (4) (5) ----------------------------------------------------------------------
(1)GCの種類(GC: GCはNew世代領域のみを対象、FullGC: New、Old、Permanent全領域が対象)
(2)ヒープの使用サイズ(GC前)
(3)ヒープの使用サイズ(GC後)
(4)ヒープのサイズ
(5)GCの処理時間
(2)の値でヒープ域の使用量がわかります。
また、実行中のヒープ域のデータは、“jheap”でも採取できます。
なお、FJVMは、New世代領域とOld世代領域を動的に変更しています。
HotSpot Server VMあるいは、HotSpot Client VMの場合、New世代領域とOld世代領域の比率は固定です。起動時のオプション指定によって比率を変更することができます。詳細は以下のホームページを参照してください。
http://java.sun.com/docs/hotspot/VMOptions.html
“-Xmx”で最大値が管理されるヒープ域とは別に、classを格納するヒープ域にPermanent世代領域があります。この領域が不足した場合もOutOfMemoryErrorが発生します。Permanent世代領域のデフォルトのサイズは、下表の通りです。
|
初期値 |
最大値 |
JDK/JRE 1.3.1 |
1MB |
64MB (FJVM/HotSpot Server VM) |
JDK/JRE 1.4.2 |
16MB (FJVM/HotSpot Server VM) |
64MB |
以下のJavaの起動オプションで、Permanent世代領域のサイズを変更することができます。
たとえば、Permanent世代領域の最大値を128MBに設定する場合は、Java起動時のオプションに"-XX:MaxPermSize=128m"を指定してください。
なお、ヒープ域の最大値を増やしても、OutOfMemoryErrorが発生し、ヒープ域の値を参照すると時間とともにヒープ域の使用量が増加するような場合は、参照解放漏れのようなメモリリーク障害が考えられますので、その場合、アプリケーションを見直してください。
なお、メモリリークの調査には“Qualyzer”が使用できます。
目次
索引
![]() ![]() |