1

ガベージ コレクターがオブジェクトを「ガベージ コレクション」するタイミングを確認しようとしています。ドキュメントによると、finalize() メソッドは、ガベージ コレクターがオブジェクトを「削除」するときに 1 回呼び出されます。

finalise() をオーバーライドして、オブジェクトを無効にした後にどの時点で呼び出されるかを確認できるかどうかを確認しようとしましたが、無期限に待機しているようです。これは機能するはずですか?

class Dog{
    ZiggyTest2 z;
    public Dog(ZiggyTest2 z){
        this.z = z;
    }

    protected void finalize() throws Throwable {
        try {
            synchronized(z){
                System.out.println("Garbage collected");
                z.notify();
            }
        } finally {
            super.finalize();
        }
    }
}

そしてメインクラス:

class ZiggyTest2{

    public static void main(String[] args){

    ZiggyTest2 z = new ZiggyTest2();        
    Dog dog = new Dog(z);   

        synchronized(z){
            try{
                dog = null;
                z.wait();
            }catch(InterruptedException ie){
                System.out.println("Interrupted");
            }           
        }
    }   
}

私がやりたいのは、 Dog オブジェクトを無効にした後に finalise() メソッドが呼び出されるのを見ることです。これが、notify() ステートメントを finalize() メソッド内に配置する理由です。ただ待ち続けるという点で機能していません..

編集

みんなありがとう。ZiggyTest2 を変更して System.gc(); を追加した後、動作するようになりました。

class ZiggyTest2{

    public static void main(String[] args){

    ZiggyTest2 z = new ZiggyTest2();        
    Dog dog = new Dog(z);   

        synchronized(z){
            try{
                dog = null;
                System.gc();
                z.wait();
            }catch(InterruptedException ie){
                System.out.println("Interrupted");
            }           
        }
    }   
}

出力:

C:\>java ZiggyTest2
Garbage collected
4

3 に答える 3

2

System.gc()dog = null を設定した後に a を追加してみてください。

于 2011-12-27T13:15:30.757 に答える
2

ガベージ コレクターは、必要な場合にのみ実行されます。プログラムで GC を実行する必要がない場合は、GC なしで 1 日中実行できます。System.gc() を呼び出して、GC を試してトリガーすることができます。

注: finalize メソッドがある場合、gc は finalize メソッドがバックグラウンド スレッドで呼び出されるのを待たないため、GC AFTER finalize が呼び出されるまでオブジェクトが存在する可能性があります。

于 2011-12-27T13:15:33.010 に答える
1

まず第一に、ガベージ コレクターがいつ実行され、何が収集されるかについての保証はありません。多くの場合、空きメモリが十分に残っているため、コレクターはこの例では実行されません。使用できますSystem.gc()が、これが実際にコレクターをトリガーするという保証はありません。ガベージコレクターを実行したいというJVMへのヒントにすぎません。

さらに、finalize()インスタンスごとに 1 回だけ実行されます。つまりfinalize()、オブジェクトが収集されない場合、それ以上ガベージ コレクションを実行してもfinalize()再度呼び出されることはありませんが、オブジェクトが収集される可能性があります。

于 2011-12-27T13:18:30.337 に答える