2

これは私がずっと抱えてきた古い問題です。開発環境に再デプロイしたい。いくつかの展開の後、permgen が不足し、サーバーを強制終了する必要があります。何年も前に、私はこの問題の解決策を見つけようとしましたが、Spring と Hibernate がお互いを問題のせいにしていることがわかりました。解決策は見つかりましたか?

Spring Roo は、実行時にクラスを生成しないと主張しているため、問題にはなりません。それは本当に機能しますか?もしそうなら、どうすればアプリケーションをそのように構成できますか?

ここに 2 つの質問があることは承知していますが、1 つに答えることができればそれで十分です :)

4

3 に答える 3

5

私が理解している限り、典型的なPermGenストレージリークは次のようになります。

  1. クラスがホットデプロイメントに置き換えられたオブジェクトへの到達可能な参照がどこかにあります。

  2. そのオブジェクトには、そのクラス記述子への参照があります。

  3. クラス記述子には、そのClassLoaderへの参照があります。

  4. ClassLoaderには、ロードしたすべてのクラスのクラス記述子への参照があります。

  5. 各クラス記述子には、クラス静的フレーム、そのバイトコード、そのネイティブコードなどへの参照があります。

permgenリークを引き起こすには、1つのオブジェクトへの1つの参照だけで十分です。列挙値である可能性がある場合、登録解除されていないリスナー、...

編集

この問題に遭遇した人々がとる通常のアプローチは、肩をすくめてPermGenヒープサイズを増やすことです。Webアプリケーションの問題を本当に修正する必要がある場合は、次のようにします。

  • Webアプリケーションがシャットダウンする方法を確認し、データベース接続/接続プールが閉じていること、すべてのコールバックが登録解除されていることなどを確認します。
  • Javaメモリプロファイラを使用して、再配置によってトリガーされたPermGen(およびその他の)メモリリークを追跡します。
  • Webアプリの進化に伴って新しいリークが発生した場合は、このプロセスを繰り返す準備をしてください。

Hibernateに特定の問題があるかどうかはわかりませんが、複雑なフレームワークは、それ自体で、またはアプリケーションコードと組み合わせて、この種の問題の影響を受けやすい可能性があります。

于 2010-10-11T14:30:58.177 に答える
2

Linuxでアプリケーションを実行している場合は、IBMJREを使用してアプリケーションを実行するとこの問題が解決します。

于 2010-10-17T19:31:15.770 に答える
0

これに役立つことがいくつかあります。Spring には、少し役立つ「IntrospectionCleanupListener」があります。Web アプリ内で JDBC 接続を読み込んで作成している場合は、アプリに読み込んだドライバーを登録解除するサーブレット コンテキスト リスナーを使用できます。これらは役に立ちますが、問題を完全に解決するわけではありません。

于 2010-10-11T13:47:55.320 に答える