1

Spring の ApplicationContext への静的参照を持つクラスがあります。クラスがアンロードされようとしているときに、そのコンテキストをクリアして、シングルトン Bean の destroy メソッドを実行する必要があります。それで、クラスがアンロードされたときに呼び出されるクラスレベルのファイナライザーコールバックがあるので、そのコールバックでコンテキストをクリアできますか?

WeakReferenceQueue とカウンターを使用してそのクラスの参照されていないオブジェクトを追跡し、クラスにライブ オブジェクトがないことを検出できるようにするという漠然とした考えがありますが、それでもクラス自体がいつアンロードされるかはわかりません。

4

2 に答える 2

1

したがって、クラスがアンロードされるときに呼び出されるクラス レベルのファイナライザー コールバックはありますか。

私は明らかな場所を調べましたが、私が知る限り、そのようなコールバックはありません。そして、JVM 自体をハッキングする以外に、それを実装する方法が思い浮かびません。

于 2012-08-15T06:11:00.070 に答える
1

「クラスをアンロード」する方法は、すべてのクラスを到達不能にし、それらをロードした ClassLoader も持つことです。Javaでクラスをアンロードするを参照してください。このプロセスの完全な説明については。

クラスは、Java の他のオブジェクトと同様のオブジェクトです。したがって、 finalizer() への古典的な呼び出しは、クラスにも実装されています。このメソッドは、明示的にではなく、ガベージ コレクターによって呼び出されます。

Java でクラスまたはオブジェクトをアンロードする標準的な方法は他にありません。dispose() を含むオブジェクト (「RefCount」と呼ばれる) を参照するオブジェクトが他にない場合に、いくつかのアクションを実行できるメソッド (たとえば、「dispose()」など) を実装することで、自分でそれを行うことができます。

オブジェクトの現在の参照カウントを知る、またはガベージ コレクションを実際に強制するには、JVM Tool Interfaceを使用する必要があります。

呼び出しを試みることもできますSystem.runFinalization()が、すべてのファイナライザーが呼び出されるという保証は JVM によって与えられません。

于 2012-08-15T04:43:38.080 に答える