gc方法如何工作?

时间:2014-09-15 17:55:51

标签: java garbage-collection

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

为什么我在两种情况下都会得到不同的输出

2 个答案:

答案 0 :(得分:3)

调用System.gc()是一个请求。运行时不必回收收集垃圾。它可能完全决定不理你。因此,您不能依赖它始终如一地做同样的事情。

在调试模式下,它确实会导致垃圾收集运行。在非调试模式下,它既不会收集垃圾,也不会等到合适的时机。

答案 1 :(得分:1)

如果您经常运行它,您可以获得 3个可能输出中的任何

垃圾收集过程可能在专用线程中运行(至少在任何最近的VM中都会运行),因此输出取决于每个线程的速度(主线程和VM的GC线程)。

在调试模式下,主线程明显变慢(您可以在单步执行代码时将其暂停。)因此GC取代了您的主线程。当你只是运行程序;在VM甚至尝试垃圾收集之前,主线程很可能会完成。

对System.gc()的调用只是一个请求"嘿做一个gc",即使VM尊重它(它不是必须的),你的请求将传递给GC线程;在GC真正开始工作之前至少会有一点延迟;还有一些时间,直到它实际发现你的垃圾对象,然后最终收集它们。