您将决定任何对象是否有资格进行垃圾收集以及决定此问题的参数是什么?

时间:2014-10-01 08:35:34

标签: java garbage-collection

什么时候任何特定对象有资格进行垃圾回收?哪个是决定这一点的参数?

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

mc=null; //line2

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

mc=null; //line5

在这种情况下,当mc对象符合垃圾收集条件时?

3 个答案:

答案 0 :(得分:1)

垃圾收集器本身采用这种解决方式,收集对象的条件取决于对它的引用次数。因此,如果一个对象没有任何引用,它就成了收集的候选者。

这并不意味着它是中等收集的,只是收集的候选人。 对象集合由generations机制管理:

  

当无法再从正在运行的程序中的任何指针到达对象时,该对象被视为垃圾。最简单的垃圾收集算法简单地遍历每个可到达的对象。剩下的任何对象都被认为是垃圾。这种方法所花费的时间与活动对象的数量成正比,这对于维护大量实时数据的大型应用程序来说是不可行的。

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

遵循相同的模式,在line3处创建新对象(我不会认为该行会使您认为它做了什么:不应该该行是mc = new MyClass();吗? )在执行第5行后成为候选人。

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

答案 1 :(得分:0)

只要活动线程(直接或通过静态字段之类的东西)不再引用到对象实例,它就有资格进行垃圾回收。

在你的情况下,在你分别在第2行和第5行中对你的对象的唯一引用之后(你毕竟有两个对象)。

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

答案 2 :(得分:0)

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

当你这样做时: mc = null; // line2

您创建的第一个对象有资格进行垃圾收集,因为变量mc不再指向它!

此行不会编译: mc = new object();

您无法以这种方式创建对象。什么是对象