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

Java 为什么JVM的GC只收集由new关键字创建的对象,java,garbage-collection,jvm,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("o

我在读一些关于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();  
     } 
}
公共类测试{
公共静态类main(){
返回null;
}
@凌驾
public void finalize(){System.out.println(“对象是垃圾收集的”);}
公共静态void main(字符串args[]){
类obj=Test.main();
测试t1=新测试();
测试t2=新测试();
t1=null;
t2=零;
obj=null;
gc();
} 
}
听说我有三个物体,即obj,t1和t2

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


当我执行这个程序时,finalize方法只调用了两次(它需要执行两到三次才能看到输出,因为nether finalize或GC被收集)

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

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


希望对您有所帮助。

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

null
由于没有要收集的对象,因此从不收集引用


无论对象是如何创建的,都可以对其进行GC编辑,但是通过其他方式(如类和字符串文字)创建的对象往往具有更长的生命周期,但它们遵循所有对象都遵循的规则。

您在哪里读到的?垃圾收集可以收集所有不再被引用的对象。当然,除非使用反射,否则所有对象都将由
new
关键字(直接或间接)创建。
obj
根本不是对象。它是
null
。它是从函数调用返回的并不重要。不能或不会在
null
上调用终结器(或任何其他方法)。还请注意
Class
Test
不同。如果没有
Test
@rajeshatwar的实例,您可以拥有
Class
的实例。该站点看起来不太可靠。您应该坚持使用Oracle官方文档和教程以及众所周知的资源(如StackOverflow)。有问题的引用(“注意:JVM的垃圾收集器只收集通过new关键字创建的对象。因此,如果您创建了任何不带new的对象,您可以使用finalize方法执行清理处理(销毁剩余对象)。)是无意义的。