質問: 新参です。参ってます。教えてください。 現在稼働中システムで不定期(週1程度)にOutOfMemoryが発生します。 Tomcatのログを見ると定期的にGCは行われてるのですが解放されないインスタンスがあるようで除々にメモリを食いつぶしていっています。 調べたところよくあるミスとしてはstatic変数に大きすぎるインスタンスを格納していたり、JVM引数の設定(-Xmx等)のし忘れなど聞きますがそのような点はないようです。 長くなりましたが要はメモリリーク箇所を特定したい訳です。現在JMeterで負荷を掛けながらNetBeans6.0.1のプロファイラを使用してます。ですが未だに原因を特定出来ずにおります。 このような経験者というか有識者の方おりましたら アプローチ方法等のみでも構いませんので ご教授頂けないでしょうか。 長くなりすみません。宜しくお願い致します。
回答: (1) static やスレッドローカルでキャッシュしている処理、セッション属性、ServletContext 属性を調べましょう。キャッシュのキー生成などを誤って無限にインスタンスをキャッシュしたことがあります。 (2) ループ処理で無限ループになっていないかを調べましょう。ローカル変数を大量に消費している可能性があります。 (3) Hashtable、HashMap、ArrayList、HashSet などをキャッシュしている場合、内部で使用されている変数がどんどん2倍になり、巨大になっている可能性があります。 (4) それ以外は知りません。