你能帮我理解垃圾收集吗?
当我强制终结时,我应该在finzlize方法中出现。我在那里放了一个断点。
好吧,当我开始调试时,我的程序在没有停在该断点处完成。 你能帮我理解我做错了什么吗?
public class Book {
protected void finalize(){
int a = 0; // Breakpoint;
}
}
public class Test {
public static void main(String[] args){
Book a = new Book();
System.gc();
}
}
答案 0 :(得分:3)
在这种特殊情况下,新的Book
实例不会被垃圾收集,因为它仍然被局部变量a
引用。
此外,正如其他答案所示,在finalize
返回之前,无法保证所有对象都完全GCed(并且System.gc
已调用)。特别是,稍后可以在不同的线程中调用finalize
方法。如果您的主应用程序在此之前终止,则可能根本不会调用该方法。
答案 1 :(得分:1)
垃圾收集是查看堆内存,识别哪些对象正在使用哪些对象以及删除未使用的对象的过程。
in use object 或引用的对象意味着程序的某些部分仍然保持指向该对象的指针。
程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。
有关详细信息Java Memory Management和How Garbage Collection works in Java