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

时间:2015-07-09 14:55:51

标签: 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 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对象)。

3 个答案:

答案 0 :(得分:1)

当Java应用程序终止时,JVM通常也会终止于操作系统的范围,因此那时的GC没有实际意义。在按照应用程序定义的有序关闭JVM之后,所有资源都返回到操作系统。

答案 1 :(得分:1)

您正在混淆一个对象变为符合条件的用于垃圾收集的事件与实际收集垃圾的过程,或者更准确地说,回收内存。

垃圾收集器不会因为引用变为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
}

优化器可能会删除对象的整个创建,因为它没有可观察到的效果。然后,没有垃圾收集,因为首先没有创建对象。

另见here

答案 2 :(得分:0)

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

  1. 局部变量
  2. 活动的java主题
  3. 静态变量
  4. jni references