Я пытаюсь увидеть, когда сборщик мусора "мусор собирает" объект. Согласно документации, метод finalize () вызывается один раз, когда сборщик мусора «удаляет» объект.
Я попытался переопределить finalize (), чтобы посмотреть, смогу ли я увидеть, в какой момент он вызывается после того, как я обнуляю объект, но, похоже, жду неопределенно долго. Должно ли это работать?
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");
}
}
}
}
Что я хочу сделать, так это увидеть, как вызывается метод finalize () после того, как я аннулирую объект Dog. Вот почему я поместил оператор 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