Насколько я понимаю, любой объект без ссылки имеет право на сборку мусора, т.е. метод 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 (); - это объект, на который нет ссылки, который создается в куче. т.е. у него нет ссылки на стек. Теоретически любой объект, не связанный со стеком, имеет право на сборку мусора, которая фактически применима к сборке мусора. Поскольку они не относятся к стеку, он также считается островом изоляции.
Интересно, ошибочно ли я понимаю в этом отношении. Спасибо. Пожалуйста, поделитесь своим мнением, если мои мысли противоречат друг другу.
finalize()
. Первый запуск GC обнаруживает, что объект недоступен, и ставит объект в очередь для завершения. Второй (или третий, или более поздний) сборщик мусора затем освободит память, если к тому времени методfinalize()
будет завершен. - person Andreas   schedule 10.08.2020Test
, так почему вы ожидаете, что этот методfinalize()
будет выполнен? - Даже если вы переместите метод в классCustomer
, это не повлияет на ситуацию, поскольку экземпляр по-прежнему ссылается на локальную переменнуюc
при запуске GC, поэтому нет никакого мусора для сбора. - Даже если вы очиститеc
перед вызовомgc()
, два потока, использующие его, скорее всего, еще не будут запущены при запуске GC (запуск потока выполняется медленно), поэтому нет никакого мусора для сбора. - Даже если потоки завершились, программа завершается немедленно, поэтому поток завершения не запускается. - person Andreas   schedule 10.08.2020