2

最近、Netbeans 6.8 を使用して JSF Web アプリケーションで作業しているときに、常に PermGen: Out Of Memory エラーが発生します。フォーラムで何人かが提案したように、これはコードのホットスワップとは関係がないことにも気付きました。通常、コードを再デプロイするたびに、ローカル Web サーバーである Tomcat 6.0 を再起動します。これは私にも時々発生していましたが、最近では頻繁に発生しています。通常、クラッシュするまでに 2 分以上かかることはありません。

この問題について私が行った重要な観察は、デバッガーを実行しているときにのみ発生するように見えるということです。サーバーを定期的に起動すると、無期限に実行されます。デバッグ モードで実行するとすぐに、この問題が発生します。

Tomcat で Java の JAVA_OPT メモリ設定を増やすためにこれまでに見つけたすべてのヒントを試しました。netbeans.conf で Netbeans に使用できるメモリを増やしてみました。まだ運がありません。私が行った特定の構成変更を確認したい場合は、それも投稿できます。

また、これは Java のメモリ リークの結果である可能性があることも読みました。私は Netbean のプロファイラーを実行してみましたが、実際に役立つことを行う前にクラッシュすることがよくありました。さらに、それが実行されたとき、ばかげた世代を持つすべてのオブジェクト割り当ては、Java ライブラリまたはプリミティブのものでした。たとえば、最大の世代を持つ char[] は、アプリの最大のメモリ ホグでした。

誰かが以前に同様の問題を抱えていたかどうか、もしそうなら、どのように解決したかを知りたいです。これは私の仕事をする能力を深刻に妨げ始めています。

助けてくれてありがとう。

4

2 に答える 2

2

このエントリをcatlina.sh(またはbat)に追加すると、うまくいきました

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
    -server -Xms1536m -Xmx1536m
    -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=512m 
    -XX:MaxPermSize=512m -XX:+DisableExplicitGC
于 2011-03-24T18:01:55.983 に答える
0

プロファイラーやデバッガーを実行せずにメモリ リークを追跡するのに役立つことがわかったのは、"jmap -histo" コマンド (jdk に付属) を使用することです。このプログラムの出力をファイルに保存します。アプリケーションの実行中に、これを数分ごとに実行します。出力を収集し、常に数とサイズが増加しているオブジェクトを探します。リークが発生している可能性のある場所を簡単に確認できるように、選択したオブジェクトを時間の経過とともにグラフ化して、逃げたオブジェクトを実際に強調表示する簡単なアプリも作成しました。

于 2011-03-31T05:03:35.337 に答える