Interstage Application Server トラブルシューティング集 |
目次
索引
![]() ![]() |
第18章 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領域は生成されるオブジェクトを管理する領域です。領域が分かれるのは世代別にガーベッジコレクション(GC)の処理を行っているためです。
New領域は寿命の短いオブジェクトを管理します。生成直後のオブジェクトはNew領域に生成されます。数回のGC後にも残っているオブジェクトはOld領域に移動し、Old領域で管理されます。
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領域を動的に変更しています。
Server HotSpot、あるいはClient HotSpotの場合、New領域とOld領域の比率は固定です。起動時のオプション指定によって比率を変更することができます。詳細は以下のホームページを参照してください。
http://java.sun.com/docs/hotspot/VMOptions.html
“-Xmx”で最大値が管理されるヒープ域とは別に、classを格納するヒープ域にPermanent領域があります。この領域が不足した場合もOutOfMemoryErrorが発生します。
デフォルトは、1.3.1では32MB、1.4.1では64MBです。
最大値はJava起動時に指定する"-XX:MaxPermSize"オプションによって決まります。たとえば、Permanent領域の最大値を128MBに設定する場合は、Java起動時のオプションに"-XX:MaxPermSize=128m"を指定してください。
“-Xmx"オプションでヒープ域の最大値を増やしても、OutOfMemoryErrorが発生し、ヒープ域の値を参照すると時間とともにヒープ域の使用量が増加するような場合は、参照解放漏れのようなメモリリーク障害が考えられますので、その場合、アプリケーションを見直してください。
なお、メモリリークの調査には“Qualyzer”が使用できます。
目次
索引
![]() ![]() |