2009年6月19日金曜日

Java Plug-inのOut Of Memory Error問題の対策

1.十分の物理メモリを確保した上で、
JVMのパラメータ「-Xmx」をできるだけ、大きく設定
してください。

2.GCが効率よくさせるために、JVMの関連パラメータを
適当な値を設定してください。
例:
-XX:NewRatio
該当変数がヒープサイズにNew Generation領域とOld Generation領域
の割合比率を示すパラメータです。
Old Generationの量が少なくても、New Generationの量と2つの
Survivor spaceの量の全体と同じですが、実際の運用は、これ以上
にしてください。
Old Generationの量が少なくなると、GCが正常に完了できない恐れがある。
-XX:NewRatio=3にしたら、NewとOldの比率が1:3と言う意味です。
つまり、New Generationがヒープサイズの1/4を占めるということ。

3.メモリリーク(漏れ)のチェック
通常、JVMのGCが自動に廃棄されたオブジェクトなどを回収しますが、
いったんオブジェクトが参照されていたら、この参照自体が削除された限り、
GCが該当オブジェクトを回収しないまま。これは、Javaのメモリリークです。
メモリリークがアプリの中に存在しているかを確認するため、いくつかの
手段があります。
・GCログの解析
Java Plug-inのJVMパラメータに「-Xloggc:java-plugin-log.gc」のように
設定すれば、アプリが実行されるたびに、GCファイル「java-plugin-log.gc」が
生成される。
生成したGCログに関しては、直接解析するか、ツール(GCViewer、JTuneなど)
により解析するか、自分の運用に従って、実施してください。

・JVMPI(JVM Profiler Interface)よりの統計、解析
この方法がいまだJavaの正式なリリースものではないですが、いつか正式の
リリースになるでしょう。
ほかの手段より、もっと詳しく、幅広いJVM関連情報が取れる。
一方、自分が実装しないといけないらしい。ちょっと複雑かなと思います。

・アプリ自体の解析
アプリの処理ロジックを分析し、参照が存在しているところ(HashMapなど)
に対して、必要な参照が参照先のオブジェクトの廃棄に伴い、削除されているか
を確認してください。
特に、グローバルの参照、クラスラベルの参照など。

0 件のコメント: