Уничтожение объектов - PullRequest
       7

Уничтожение объектов

0 голосов
/ 08 октября 2019

Недавно мне задали вопрос в одном из интервью:

Есть 20 объектов и 7 нужно уничтожить. Напишите алгоритм уничтожения только 7 объектов, используя только сборщик мусора.

Я использовал традиционный способ уничтожения объектов, используя System.gc().

public class TestGarbage {
    public static void main(String[] args) throws InterruptedException {

        for (int i = 0; i < 20; i++) {
            TestGarbage ti = new TestGarbage();
            // System.out.println(ti);
        }

        for (int i = 0; i < 7; i++) {
            // Nullifying the reference variable
            TestGarbage ti = null;

            // requesting JVM for running Garbage Collector
            System.gc();
            // Runtime.getRuntime().gc();
        }

    }

    @Override
    // finalize method is called on object once
    // before garbage collecting it
    protected void finalize() throws Throwable {
        System.out.println("Garbage collector called");
        System.out.println("Object garbage collected : " + this);
    }
}

public class TestGarbage {
    public static void main(String[] args) throws InterruptedException {

        for (int i = 0; i < 20; i++) {
            TestGarbage ti = new TestGarbage();
            // System.out.println(ti);
        }

        for (int i = 0; i < 7; i++) {
            // Nullifying the reference variable
            TestGarbage ti = null;

            // requesting JVM for running Garbage Collector
            System.gc();
            // Runtime.getRuntime().gc();
        }

    }

    @Override
    // finalize method is called on object once
    // before garbage collecting it
    protected void finalize() throws Throwable {
        System.out.println("Garbage collector called");
        System.out.println("Object garbage collected : " + this);
    }
}

Но интервьюер былсовсем не удовлетворенный, он спросил меня, что нет никакой гарантии, что вышеупомянутый метод определенно запустит сборщик мусора.

Итак, как это можно решить? У меня есть понимание, что после Java 8 или более поздней версии программистам не нужно заботиться об уничтожении объектов, которые не используются. Об этом позаботится сборщик мусора.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Тот факт, что у вас есть метод финализатора, может сбить вас с толку. Когда объект имеет финализатор и становится пригодным для сбора, GC добавит его в список финализаторов. Этот список обрабатывается отдельным потоком JVM, что означает, что финализатор не гарантированно будет запущен в любой момент (или даже до выхода из программы).

Из-за этого каждому объекту требуется минимум из двух циклов GC, которые необходимо собрать. Первый добавляет его в список финализаторов и, при условии, что финализатор будет обработан до следующего GC, будет собран в следующий раз. Тем не менее, может быть гораздо больше циклов GC, прежде чем он будет собран, если вообще когда-либо.

Финализаторы никогда не были сильной особенностью в Java, и метод Object.finalize() был объявлен устаревшим в JDK 9.

0 голосов
/ 08 октября 2019

Итак, после вашего ввода я сделал несколько изменений:

public class TestGarbage {
    public TestGarbage(int i) {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) throws InterruptedException {

        TestGarbage[] testGarbage = new TestGarbage[20];

        for (int i = 0; i < 20; i++) {

            testGarbage[i] = new TestGarbage(i);
            //System.out.println(testGarbage[i]);
        }

        for (int i = 0; i < 7; i++) {
            // Nullifying the reference variable
            testGarbage[i] = null;

            // requesting JVM for running Garbage Collector
            System.gc();
            // Runtime.getRuntime().gc();
        }

    }

    @Override
    // finalize method is called on object once
    // before garbage collecting it
    protected void finalize() throws Throwable {
        System.out.println("Garbage collector called");
        System.out.println("Object garbage collected : " + this);
    }
}

Но иногда сборщик мусора вызывается 7 раз -

Garbage collector called
Object garbage collected : TestGarbage@c7b3681
Garbage collector called
Object garbage collected : TestGarbage@2bcc97e
Garbage collector called
Object garbage collected : TestGarbage@6835df1
Garbage collector called
Object garbage collected : TestGarbage@4381c345
Garbage collector called
Object garbage collected : TestGarbage@169b2a8a
Garbage collector called
Object garbage collected : TestGarbage@7208e61e
Garbage collector called
Object garbage collected : TestGarbage@6ef8517b

, а иногда только еговызов только два раза -

Сборщик мусора, называемый «Сборка мусора объекта»: TestGarbage @ c7b3681 Сборщик мусора, называемый «Сборка мусора объекта»: TestGarbage @ 2bcc97e

...