12

これが私のユースケースです。アプリケーションで発生する可能性のあるメモリ リークを絞り込もうとしており、メモリ分析ツールを使用してヒープのスナップショットを作成し、オブジェクト インスタンスと参照を探すことができます。(役立つ場合に備えて、YourKit を使用しています。)

このアプリケーションは、ダイナミック プロキシと CGLIB プロキシを広範囲に使用します。これにより、WeakHashMap にクラスとクラスローダーへの大量の参照が格納されます。

テスト ケースの実行後、オブジェクト X とそのクラスローダーへのすべてのハード参照がなくなることを期待していますが、テスト ケースには多くのプロキシが含まれていたため、最終的に多くの弱い/ソフト参照が残っています。(私は WeakHashMap 参照しか見つけることができませんが、YourKit は要約で弱い参照とソフト参照の両方を 1 つの項目にラップしているため、どこかでソフト参照が欠落していないかどうかはわかりません。)

これは、JVM から完全な GC を要求した後でも当てはまります。(sun 1.6.0_23 JDK をサーバーモードで使用)

JVMは、これらのオブジェクトへの弱い/ソフト参照しかないことを認めているようですが、これらのことを 100% 確実にするために GC に強制することはできません。(したがって、私が望むのは、これがヒープから完全に消え、permgen のクラスローダーの使用もなくなることです。)

ソフト/弱く参照されているオブジェクトのみを破棄するように JVM を構成および/または強制する方法を知っている人はいますか?

4

1 に答える 1

10

GC を呼び出すと、常にすべての弱く到達可能なオブジェクトを解放する必要があります (呼び出しによって行われた「要求」System.gcが実際に許可されていると仮定します)。弱い参照が GC によってクリアされていない場合、それはオブジェクトが少なくともソフトに到達可能であることを意味します。

ソフト参照のクリアは、JVM の裁量に任されているため、よりトリッキーです。ソフト到達可能オブジェクトのクリアを保証する唯一の方法は、OutOfMemoryErrorをスローさせることです。このトリックは、このディスカッションで示されています。

于 2011-08-06T16:31:43.443 に答える