Java 应用程序结束时的垃圾收集

Java 应用程序结束时的垃圾收集,java,garbage-collection,Java,Garbage Collection,据我所知,当为变量分配空值时,对象可以被垃圾收集: Object a = new Object; a = null; //it is now available for garbage collection 或者当对象由于方法的执行而超出范围时: public void gc(){ Object a = new Object; } //once gc method is done the object where a is referring to will be available

据我所知,当为变量分配空值时,对象可以被垃圾收集:

Object a = new Object;
a = null; //it is now available for garbage collection
或者当对象由于方法的执行而超出范围时:

public void gc(){
    Object a = new Object;
} //once gc method is done the object where a is referring to will be available for garbage collection
当应用程序刚刚结束时,给定的超出范围不是也一样吗

class Ink{}
public class Main {
    Ink k = new Ink();

    public void getSomething(){
        //method codes here
    }

    public static void main(String[] args) {
        Main n = new Main();
    }
}

当应用程序结束时,我预计应该对2个对象(Ink对象和Main对象)进行垃圾收集。

当Java应用程序终止时,JVM通常也会在操作系统的范围内终止,因此此时GC是没有意义的。在应用程序定义的JVM有序关闭后,所有资源都已返回操作系统。

您将对象符合垃圾收集条件的事件与收集垃圾或更准确地说回收内存的实际过程混淆了

垃圾收集器不会仅仅因为引用变为
null
或对象超出范围而运行,这将浪费资源。它通常运行是因为内存不足或CPU资源未使用

此外,术语“垃圾收集”具有误导性。JVM的实际任务是标记所有仍处于活动状态的对象(也称为可访问对象)。其他一切都被认为是可回收的,也就是垃圾。因为在JVM终止时,整个内存本身是回收的,所以不需要搜索可访问的引用

也就是说,理解大多数关于内存管理的想法都是无用的是很有帮助的。例如,在您的代码中:

public void gc(){
    Object a = new Object;
    // even here the object might get garbage collected as it is unused in subsequent code
}
优化器可能会删除对象的整个创建,因为它没有可观察的效果。这样,就不会有垃圾回收,因为对象还没有被创建


另请参见。

JVM监视GC根-如果GC根中没有可用的对象,则它是垃圾收集的候选对象。GC根可以是

  • 局部变量
  • 活动java线程
  • 静态变量
  • jni参考

  • 当应用程序结束时,JVM退出,不再有GC线程。JVM使用的所有内存都由操作系统回收。请注意,当对象符合GC条件时,分配null或超出范围不是必需的。重要的是,从根(即静态变量或线程堆栈)无法再访问该对象。是的,感谢注意,我指的是要进行垃圾收集的对象的可用性。是的,不知道GC何时运行,但只要无人引用该对象,它就是GC的候选对象。