为什么JVM的GC只收集由new关键字创建的对象

时间:2016-05-26 11:01:16

标签: java garbage-collection jvm

我正在阅读一篇关于GC(垃圾收集器)的文章。在那里他们提到JVM的GC只选择那些由new关键字创建的对象,我想通过覆盖finalize方法来测试它,它也做了同样的事情。任何人都可以解释一下为什么JVM会这样做。

public class Test{

    public static Class<Test> main(){

        return null;
    }

    @Override
    public void finalize(){System.out.println("object is garbage collected");}  
     public static void main(String args[]){  

       Class<Test> obj= Test.main();  

       Test t1 = new Test();
       Test t2 = new Test();

       t1 = null;
       t2 = null;
       obj = null;

       System.gc();  
     } 
}

听到我有三个对象,即obj,t1和t2。

t1和t2是使用new关键字创建的对象,但是obj调用了一些方法(如果你想要你可以保留其他东西)。之后所有三个对象都将无效并请求GC进行垃圾收集。

当我执行此程序时,finalize方法仅被调用两次(它需要执行两到三次以查看输出,因为nether finalize也没有GC被获取)。

2 个答案:

答案 0 :(得分:1)

只有在不再引用类时才会收集类。

null引用永远不会被收集,因为没有要收集的对象。

创建对象的方式并不重要,它们可以是GC编辑的,但是通过其他方式(如类和字符串文字)创建的对象往往具有更长的生命周期,但它们遵循相同的规则对象跟随。

答案 1 :(得分:0)

无论new关键字或Class.newInstance()或其他创建对象的方式,它都会占用堆内存。 在这种情况下,obj为空,因此,它不消耗任何堆内存,它将不会执行finalize

如果您想执行三次,请尝试以下操作:Test.class.newInstance()

希望能帮到你。