0

在下面的代码中,对象矩形是否可能被垃圾收集器销毁?

...
 Point point = new Point(2,4);
 Rectangle rectangle = new Rectangle (point, 20, 20);
 point = null;
...

我认为垃圾收集器销毁点和矩形是合理的,因为矩形引用了无效的点。

4

4 回答 4

1

如果一个对象不能从任何活动线程或任何静态引用中访问,则该对象有资格进行垃圾收集或 GC - 如果一个对象的所有引用都为空,则可以说该对象有资格进行垃圾收集。此外,阅读参考类型(强、弱、软和幻影)。

于 2012-07-18T15:51:19.773 回答
1

这两个对象都不能被收集,因为rectangle它指的是 Rectangle 并且它指的是 Point 对象。事实point不再是指什么都没有关系。

于 2012-07-18T15:52:04.377 回答
0

取决于 Rectangle 的构造函数的作用。它可以存储对点对象的引用或复制其值。

在第一种情况下,两个对象都不会被 GC。在第二种情况下,只有 Point 会被 GCed。

于 2012-07-18T15:53:04.190 回答
0

你没有给出足够的例子来说明。一旦超出范围,它们都将有资格获得 GC,范围是包含声明的最接近的大括号集。

假设矩形内部有一个 Point 类型的字段,它存储了您传递给它的点:

{
 Point point = new Point(2,4);
 Rectangle rectangle = new Rectangle (point, 20, 20);
 point = null;
 //No GC yet!
}
//Now they can be GC'd

将点引用设置为 null 与此无关。如果没有其他对象有引用,GC 将识别“循环”引用并收集这两个对象。如果您存储了矩形的副本, 将点变量设置为 null不会使矩形内的点无效!point = null;将该指针的值设置为null,它不会更改它曾经指向的对象!

于 2012-07-18T15:53:47.980 回答