Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谁来决定任何对象是否有资格进行垃圾收集?决定这一点的参数是什么?_Java_Garbage Collection - Fatal编程技术网

Java 谁来决定任何对象是否有资格进行垃圾收集?决定这一点的参数是什么?

Java 谁来决定任何对象是否有资格进行垃圾收集?决定这一点的参数是什么?,java,garbage-collection,Java,Garbage Collection,任何特定的对象何时有资格进行垃圾收集?考虑哪些参数决定了这一点 MyClass mc = new MyClass(); mc.myMethod(); //line1 mc=null; //line2 mc=new object(); //line3 mc.myMethod(); //line4 mc=null; //line5 在这种情况下,当mc对象有资格进行垃圾收集时?一旦不再有活动线程(直接或间接通过静态字段等方式)对对象实例的引用,它就有资格进行垃圾收集 在本例中,在分别将第2行

任何特定的对象何时有资格进行垃圾收集?考虑哪些参数决定了这一点

MyClass mc = new MyClass();
mc.myMethod(); //line1

mc=null; //line2

mc=new object(); //line3
mc.myMethod(); //line4

mc=null; //line5

在这种情况下,当mc对象有资格进行垃圾收集时?

一旦不再有活动线程(直接或间接通过静态字段等方式)对对象实例的引用,它就有资格进行垃圾收集

在本例中,在分别将第2行和第5行中对对象的唯一引用清空之后(毕竟有两个对象)


当然,如果
mc.myMethod()
有一个奇怪的副作用,使
mc
保持活动状态(例如将其保存在线程本地或静态变量中),则情况可能并非如此。

每个没有指向它的变量的对象都有资格进行垃圾收集

当您这样做时:mc=null//第2行

您创建的第一个对象符合垃圾收集条件,因为变量mc不再指向它

这一行不会编译:mc=new object()


不能以这种方式创建对象。对象是什么?

此决定由垃圾收集器本身作出,要收集的对象的条件取决于对它的引用数。所以,如果一个对象没有任何引用,它将成为集合的候选对象

这并不意味着它是间接收集的,只是收集的候选对象。 对象集合由以下机制控制:

当运行程序中的任何指针无法再访问对象时,该对象被视为垃圾。最直接的垃圾收集算法只是在每个可到达的对象上迭代。剩下的任何对象都将被视为垃圾。这种方法所需的时间与活动对象的数量成正比,这对于维护大量活动数据的大型应用程序来说是不允许的

关于您的代码,在第一行中创建的对象
MyClass mc=new MyClass()在执行第三个后立即成为收集的候选
mc=null//第2行

按照相同的模式,在执行第5行后,在
line3
创建的新对象(我不认为该行与您认为的一样:该行不应该是
mc=new MyClass();
?)成为候选行


请注意,即使您删除了
line2
,第一个对象仍将可供收集,因为它不再被引用。

在第2行,在第1行创建的对象和在第5行创建的对象符合GC条件。除非在使用这些对象的myMethod()中生成任何新线程,否则什么是mc对象????在第1行创建的MyClass对象在第2行执行后可能有资格成为垃圾。执行第5行后,在第3行创建的对象可能有资格成为垃圾。