3

Java オブジェクトの GC 呼び出しを検出する最良の方法は?

C++ コード用の Java ラッパーを作成しています。GC が呼び出されるたびに、C++ コードで割り当てられたメモリを解放する必要があります。

いくつかの解決策を見ましたが、満足できるものはありませんでした。

そのうちの1つは次のとおりです。

Object obj = null;
try{
    obj = new Object();
    // do things
} finally {
   if(obj != null){
      obj.freeCObjects();
   }
}
4

3 に答える 3

2

で利用可能なfinalize()メソッドを検討することをお勧めしますjava.lang.Object

It is called by the garbage collector on an object when garbage collection determines 
that there are no more references to the object.

一般に、JVM は がオブジェクトに対して呼び出されることを保証しないため、ファイナライザーは避けるのが最善ですfinalize()が、ネイティブ (通常は非 Java) リソースをクリーンアップする必要がある場合は、ファイナライザーが役立ちます。

以下に簡単な例を示します。

    Object obj = new Object() {
        @Override
        protected void finalize() throws Throwable {
            System.out.println("finalize object");
            super.finalize();
        }
    };

ファイナライザーは、ガベージ コレクションによって呼び出される場合があります。

于 2013-10-31T20:31:04.213 に答える
0

GC を実行するたびにメモリを解放する必要はほとんどありません。多くの場合、GC の実行時にメモリを未使用のオブジェクトに解放する必要があります。

これを行うには、リソースを解放する finalize() の実装をラッパーに提供します。ラッパーが破棄されると、リソースをクリーンアップできます。すべての GC でこれを本当に消したい場合は、ラッパーへの WeakReference を保持できます。

ところで、OpenJDK/Oracle HotSpot JVM には、リソースを解放するための別のより軽量なメカニズムがあります。これには、ファイナライズ キューに追加されていない Cleaner オブジェクトの使用が含まれます (つまり、より速く解放できます)。例として、Cleaner を持つ直接の ByteBuffer を参照してください。

于 2013-10-31T20:48:04.907 に答える