什么时候任何特定对象有资格进行垃圾回收?哪个是决定这一点的参数?
MyClass mc = new MyClass();
mc.myMethod(); //line1
mc=null; //line2
mc=new object(); //line3
mc.myMethod(); //line4
mc=null; //line5
在这种情况下,当mc对象符合垃圾收集条件时?
答案 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();
您无法以这种方式创建对象。什么是对象?