エラー
- java.lang.OutOfMemoryError: PermGen space
PermGen space(Permanent Generation space):Javaクラスとそのメタ情報が格納されるメモリ領域のこと
クラスはロードされる時点でPermGen spaceに保存される。
クラスのインスタンスを格納するヒープ領域と違って、GCはPermGen spaceに保存された情報を回収しない。
そのため、たくさんのクラスがアプリにロードされる場合、PermGen spaceサイズを超えてしまうと、「java.lang.OutOfMemoryError: PermGen space」を発生する。
→即ち、java.lang.OutOfMemoryError: PermGen spaceを発生する原因は
1)JVMにロードされるクラスは多すぎる
2)PermGen spaceサイズは小さすぎる
などが考えられる。
【解決方法】
1)できるだけロードするクラス(ダイナミック生成されるクラスも含む)を減らす
※Tomcatの場合、共有できるjarファイルを$TOMCAT_HOME/shared/libに移動することも一つの手。
2)PermGen spaceサイズを大きくする:MaxPermSizeオプション
- XX:PermSize → Permanent領域初期使用量
- XX:MaxPermSize → Permanent領域最大使用量
※設定例::-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
※Tomcatの設定例:
TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
Java VM オプション
- -Xloggc
- Xloggc:<file> タイムスタンプが付いたファイルにGCステータスのログを記録する
Print more details at garbage collection. Manageable. (Introduced in 1.4.0.)
- Xloggc:./gc.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails
出力結果
2012-02-21T23:24:35.564+0900: 0.712: [GC [PSYoungGen: 16448K->2686K(19136K)] 16448K->2906K(62848K), 0.0158370 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
2012-02-21T23:24:35.981+0900: 1.129: [GC [PSYoungGen: 19109K->2679K(35584K)] 19329K->5567K(79296K), 0.0235950 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
2012-02-21T23:24:37.045+0900: 2.192: [GC [PSYoungGen: 35575K->2678K(35584K)] 38463K->15244K(79296K), 0.0277780 secs] [Times: user=0.04 sys=0.00, real=0.02 secs]
2012-02-21T23:24:37.276+0900: 2.424: [GC [PSYoungGen: 10039K->2678K(68480K)] 22606K->17616K(112192K), 0.0168570 secs]
最終更新:2014年02月24日 08:38