Java gc方法是如何工作的?

Java gc方法是如何工作的?,java,garbage-collection,Java,Garbage Collection,当我调试这段代码时,o/p如下所示 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; Syste

当我调试这段代码时,o/p如下所示

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");
}
}
当我跑的时候,我得到了这个

Finalize method
Finalize method
abc
为什么在这两种情况下我都得到不同的输出

调用
System.gc()
是一个请求。运行时不必在响应时收集垃圾。它很可能决定不理你。因此,你不能指望它始终如一地做同样的事情

很可能,在调试模式下,它确实会导致运行垃圾收集。在非调试模式下,它要么不收集垃圾,要么等到合适的时候再收集

调用
System.gc()
是一个请求。运行时不必在响应时收集垃圾。它很可能决定不理你。因此,你不能指望它始终如一地做同样的事情


很可能,在调试模式下,它确实会导致运行垃圾收集。在非调试模式下,它要么不收集垃圾,要么等到合适的时候再收集

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

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

在调试模式下,主线程的速度要慢得多(在单步执行代码时,您可能会暂停它)。因此,GC超过了您的主线程。当你简单地运行程序时;在VM尝试垃圾收集之前,主线程很可能会一直运行到completeion


对System.gc()的调用只是一个请求“hey please do A gc”,即使VM接受它(这不是必需的),您的请求也将被传递到gc线程;在GC实际开始工作之前至少有一点延迟;还有一段时间,直到它真正发现你的垃圾对象并最终收集它们。

如果你经常运行它,你可以得到3种可能的输出中的任何一种

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

在调试模式下,主线程的速度要慢得多(在单步执行代码时,您可能会暂停它)。因此,GC超过了您的主线程。当你简单地运行程序时;在VM尝试垃圾收集之前,主线程很可能会一直运行到completeion

对System.gc()的调用只是一个请求“hey please do A gc”,即使VM接受它(这不是必需的),您的请求也将被传递到gc线程;在GC实际开始工作之前至少有一点延迟;还有一段时间,直到它真正发现你的垃圾对象,然后最终收集它们

abc
Finalize method
Finalize method