ガベージ コレクターがオブジェクトを「ガベージ コレクション」するタイミングを確認しようとしています。ドキュメントによると、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