Сбор мусора на острове изоляции

Насколько я понимаю, любой объект без ссылки имеет право на сборку мусора, т.е. метод finalize класса должен вызываться при сборе мусора. У меня есть класс ниже и вопрос, почему объекты потока без ссылки в основном классе не вызывают метод finalize во время сборки мусора, если это так.

package com;

class Customer {
    int amount = 10000;

    synchronized void withdraw(int amount) {
        System.out.println("going to withdraw...");

        if (this.amount < amount) {
            System.out.println("Less balance; waiting for deposit...");
            try {
                wait(10000);
            } catch (Exception e) {
            }
        }
        this.amount -= amount;
        System.out.println("withdraw completed...");
    }

    synchronized void deposit(int amount) {
        System.out.println("going to deposit...");
        this.amount += amount;
        System.out.println("deposit completed... ");
        notify();
    }
    
}

class Test {
    public static void main(String args[]) throws InstantiationException, IllegalAccessException {
        final Customer c = new Customer();

        //Island of Isolating a Thread
        new Thread() {
            public void run() {
//              System.out.println("withdraw thread ");
                c.withdraw(15000);
            }
        }.start();
        //Island of Isolating another Thread
        new Thread() {
            public void run() {
//              System.out.println("deposit thread ");

                c.deposit(10000);
            }
        }.start();
  //attempting to gc manually.
          System.gc();

    }
    
    //Calling a finialize() method to check whether it is garbage collected or not
    protected void finalize() throws Throwable {
        System.out.println("Finalize method called");
    }

    
}

Изменить: новый поток () {// бла-бла} .start (); - это объект, на который нет ссылки, который создается в куче. т.е. у него нет ссылки на стек. Теоретически любой объект, не связанный со стеком, имеет право на сборку мусора, которая фактически применима к сборке мусора. Поскольку они не относятся к стеку, он также считается островом изоляции.

Интересно, ошибочно ли я понимаю в этом отношении. Спасибо. Пожалуйста, поделитесь своим мнением, если мои мысли противоречат друг другу.


person Harish Raj    schedule 10.08.2020    source источник
comment
Финализаторы вызываются фоновым потоком между запусками сборщика мусора, поэтому потребуется не менее 2 запусков сборщика мусора, чтобы полностью собрать объект, имеющий метод finalize(). Первый запуск GC обнаруживает, что объект недоступен, и ставит объект в очередь для завершения. Второй (или третий, или более поздний) сборщик мусора затем освободит память, если к тому времени метод finalize() будет завершен.   -  person Andreas    schedule 10.08.2020
comment
Ваш код никогда не создает экземпляр класса Test, так почему вы ожидаете, что этот метод finalize() будет выполнен? - Даже если вы переместите метод в класс Customer, это не повлияет на ситуацию, поскольку экземпляр по-прежнему ссылается на локальную переменную c при запуске GC, поэтому нет никакого мусора для сбора. - Даже если вы очистите c перед вызовом gc(), два потока, использующие его, скорее всего, еще не будут запущены при запуске GC (запуск потока выполняется медленно), поэтому нет никакого мусора для сбора. - Даже если потоки завершились, программа завершается немедленно, поэтому поток завершения не запускается.   -  person Andreas    schedule 10.08.2020
comment
отличный! тогда у меня было неправильное представление о том, что все объекты класса, на которые нет ссылок, будут иметь право на сборку мусора. потому что это то, что я продолжал читать на большей части сайта. об объектах, на которые нет ссылок = Остров изоляции = право на сборку мусора.   -  person Harish Raj    schedule 10.08.2020
comment
На ваш взгляд, какой объект (экземпляр) не используется (недоступен) во время выполнения сборки мусора? Объясните, почему вы считаете, что этот объект недоступен.   -  person Andreas    schedule 10.08.2020
comment
снова отредактировал мой вопрос с моим пониманием.   -  person Harish Raj    schedule 16.08.2020
comment
На это уже был дан ответ.   -  person Holger    schedule 17.08.2020


Ответы (1)


почему объекты потока без ссылки в основном классе не вызывают finalize

Сборщик мусора считает активные потоки активными, даже если на эти потоки больше ничего не ссылается.

Другими словами, сборка мусора не приводит к внезапному завершению работы кода. Если бы это было так, это было бы большой головной болью.

Вдобавок вы реализовали finalize только в классе, который никогда не создаете.

person Joni    schedule 10.08.2020