2

Webアプリを停止した後、かなりの量のPermGenがリリースされていません。原因はWebappClassLoader(Tomcatの場合ですが、Jettyでも発生します)のようです。これは、他の多数のオブジェクトからの参照によってメモリに保持されます。次の画像は、WebappClassLoaderを参照するオブジェクト、およびそれらを参照するものなどを示しています。

代替テキスト

しがみつくオブジェクトの1つは、のインスタンスのようです。このインスタンスnet.lag.logging.Level$INFO$への参照は、の静的known配列に格納されjava.util.logging.Levelます。

それjava.util.logging.Level自体のすべてのインスタンスへの静的参照を保持しているようです。悪い、厄介java.util.logging.Level!私はそれについて何かすることができますか?java.util.loggingフレームワークはサードパーティのライブラリによって使用されているため、使用しないという選択肢はないと思います。

4

1 に答える 1

2

Sunにレベルの実装を修正させるか、ライブラリを変更してカスタムレベルを廃止する以外に、私が考えることができる唯一の方法は、ライブラリをWebアプリケーションクラスローダーからコンテナ(共有または共通クラスローダー)に移動することです。

これを行うと、Levelのカスタムインスタンスは引き続き存在しますが、それらはWebアプリケーションにリンクされなくなります。そのため、Webアプリをバウンスしても、同じレベルをリサイクルし続けます(新しいレベルがリークすることはありません)。

もちろん、これはライブラリのクラスローダーに影響し、破損する可能性があります。Webアプリケーションに含める必要があり、コンテナーに移動できないものもあります。ライブラリが引き続き機能する場合でも、ライブラリ自体がWebアプリケーションの他の部分への同様の参照を保持している可能性があります。これも、まったく同じ問題です。それでも、試してみてください。

于 2010-10-19T04:50:03.217 に答える