私が理解している限り、典型的なPermGenストレージリークは次のようになります。
クラスがホットデプロイメントに置き換えられたオブジェクトへの到達可能な参照がどこかにあります。
そのオブジェクトには、そのクラス記述子への参照があります。
クラス記述子には、そのClassLoaderへの参照があります。
ClassLoaderには、ロードしたすべてのクラスのクラス記述子への参照があります。
各クラス記述子には、クラス静的フレーム、そのバイトコード、そのネイティブコードなどへの参照があります。
permgenリークを引き起こすには、1つのオブジェクトへの1つの参照だけで十分です。列挙値である可能性がある場合、登録解除されていないリスナー、...
編集
この問題に遭遇した人々がとる通常のアプローチは、肩をすくめてPermGenヒープサイズを増やすことです。Webアプリケーションの問題を本当に修正する必要がある場合は、次のようにします。
- Webアプリケーションがシャットダウンする方法を確認し、データベース接続/接続プールが閉じていること、すべてのコールバックが登録解除されていることなどを確認します。
- Javaメモリプロファイラを使用して、再配置によってトリガーされたPermGen(およびその他の)メモリリークを追跡します。
- Webアプリの進化に伴って新しいリークが発生した場合は、このプロセスを繰り返す準備をしてください。
Hibernateに特定の問題があるかどうかはわかりませんが、複雑なフレームワークは、それ自体で、またはアプリケーションコードと組み合わせて、この種の問題の影響を受けやすい可能性があります。