Java 为什么JVM的GC只收集由new关键字创建的对象
我在读一些关于GC(垃圾收集器)的文章。在那里,他们提到JVM的GC只收集由new关键字创建的对象,我想通过重写finalize方法来测试它,它也这样做了。谁能解释一下为什么JVM会这样做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
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方法执行清理处理(销毁剩余对象)。)是无意义的。