Наблюдение за сборщиком мусора и мусором - PullRequest
1 голос
/ 27 декабря 2011

Я пытаюсь увидеть, когда сборщик мусора "мусор собирает" объект. Согласно документации, метод 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

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Сборщик мусора работает только тогда, когда это необходимо.Если вашей программе не нужно выполнять сборку мусора, она может работать весь день без таковой.Вы можете вызвать System.gc (), чтобы попытаться запустить GC.

Примечание: если у вас есть метод finalize, gc не будет ждать вызова методов finalize в фоновом потоке, поэтому объектсуществуют до тех пор, пока не будет вызван GC ПОСЛЕ финализации.

2 голосов
/ 27 декабря 2011

Попробуйте добавить System.gc() после установки dog = null.

1 голос
/ 27 декабря 2011

Ну, во-первых, нет никаких гарантий относительно того, когда работает сборщик мусора и что будет собираться. Скорее всего, сборщик не работает в вашем примере, так как осталось много свободной памяти. Вы можете использовать System.gc(), но нет гарантии, что это на самом деле вызовет сборщик, это всего лишь подсказка JVM, что вы хотите, чтобы он запускал сборщик мусора.

Кроме того, finalize() будет запускаться только один раз для каждого экземпляра, т. Е. Когда finalize() запрещает сбор объекта, дальнейший запуск сборки мусора не вызовет finalize() снова, но он может собрать объект.

...