public class GarbageC {
public void finalize()
{
System.out.println("Finalize method");
}
public static void main(String[] args) {
GarbageC c1=new GarbageC();
GarbageC c2=new GarbageC();
c1=null;
c2=null;
System.gc();
System.out.println("abc");
}
}
在我调试此代码时,o / p即将开始
Finalize method
Finalize method
abc
当我跑步时,我得到了这个
abc
Finalize method
Finalize method
为什么我在两种情况下都会得到不同的输出
答案 0 :(得分:3)
调用System.gc()
是一个请求。运行时不必回收收集垃圾。它可能完全决定不理你。因此,您不能依赖它始终如一地做同样的事情。
在调试模式下,它确实会导致垃圾收集运行。在非调试模式下,它既不会收集垃圾,也不会等到合适的时机。
答案 1 :(得分:1)
如果您经常运行它,您可以获得 3个可能输出中的任何。
垃圾收集过程可能在专用线程中运行(至少在任何最近的VM中都会运行),因此输出取决于每个线程的速度(主线程和VM的GC线程)。
在调试模式下,主线程明显变慢(您可以在单步执行代码时将其暂停。)因此GC取代了您的主线程。当你只是运行程序;在VM甚至尝试垃圾收集之前,主线程很可能会完成。
对System.gc()的调用只是一个请求"嘿请做一个gc",即使VM尊重它(它不是必须的),你的请求将传递给GC线程;在GC真正开始工作之前至少会有一点延迟;还有一些时间,直到它实际发现你的垃圾对象,然后最终收集它们。