Interstage Application Server トラブルシューティング集
目次 索引 前ページ次ページ

第18章 Java実行環境運用時の異常

18.1 OutOfMemoryError発生時の対処

 Javaアプリケーション実行時にOutOfMemoryErrorが発生した場合、次の原因が考えられます。

New領域Old領域

 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

Permanent領域

 “-Xmx”で最大値が管理されるヒープ域とは別に、classを格納するヒープ域にPermanent領域があります。この領域が不足した場合もOutOfMemoryErrorが発生します。
 デフォルトは、1.3.1では32MB、1.4.1では64MBです。
 最大値はJava起動時に指定する"-XX:MaxPermSize"オプションによって決まります。たとえば、Permanent領域の最大値を128MBに設定する場合は、Java起動時のオプションに"-XX:MaxPermSize=128m"を指定してください。

 “-Xmx"オプションでヒープ域の最大値を増やしても、OutOfMemoryErrorが発生し、ヒープ域の値を参照すると時間とともにヒープ域の使用量が増加するような場合は、参照解放漏れのようなメモリリーク障害が考えられますので、その場合、アプリケーションを見直してください。
 なお、メモリリークの調査には“Qualyzer”が使用できます。


目次 索引 前ページ次ページ

Copyright 2006 FUJITSU LIMITED