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

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

19.1 OutOfMemoryError発生時の対処

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

New世代領域Old世代領域

 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

Permanent世代領域

 “-Xmx”で最大値が管理されるヒープ域とは別に、classを格納するヒープ域にPermanent世代領域があります。この領域が不足した場合もOutOfMemoryErrorが発生します。Permanent世代領域のデフォルトのサイズは、下表の通りです。

 

初期値

最大値

JDK/JRE 1.3.1

1MB

64MB (FJVM/HotSpot Server VM)
32MB (HotSpot Client VM)

JDK/JRE 1.4.2

16MB (FJVM/HotSpot Server VM)
4MB (HotSpot Client VM)

64MB

 以下のJavaの起動オプションで、Permanent世代領域のサイズを変更することができます。

 たとえば、Permanent世代領域の最大値を128MBに設定する場合は、Java起動時のオプションに"-XX:MaxPermSize=128m"を指定してください。

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


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

All Rights Reserved, Copyright(C) 富士通株式会社 2005