给我一个方法,问我什么时候可以进行垃圾收集,我的意思是在哪一行。我相信ooa都可以进行垃圾收集。从此,它们被设置为null。如果我错了,请纠正我。但是,问题是,什么时候有资格使用gc,我的意思是在哪一行。 ?

public Object m() {
        Object o = new Float(3.14F);
        Object[] oa = new Object[1];
        oa[0] = o; /* Line 5 */
        o = null; /* Line 6 */
        oa[0] = null; /* Line 7 */
        return o; /* Line 8 */
    }


请任何人解释。 ?

最佳答案

让我们遍历代码:

1)  o = new Float();
2)  oa = new Object[];
    at this point we have 2 objects.
3) oa[0] = o;
    at this point oa[0] holds the reference of o.
4)  o = null;
    o is still being referenced by oa[0]
5)  oa[0] = null
    o now has zero references.
6)  return o;
     o is null.


第7行是发生o的GC资格的地方。在功能退出之前,oa不能用于GC。

通常,对象只有在没有引用时才有资格使用GC。处理String时要非常小心,因为有一个特殊的地方称为字符串池。所以下面的代码:

void foo()
{
   String s = "foo";
   s=null;
   return s;
}


绝对不能保证s可以使用该功能。

意见中的问题


  您说的一个问题..oa直到该功能才可以使用GC
  退出。但是,在返回o之前,将oa设置为null,并且它不存在
  也提到


回答:


  oa未设置为null。设置为null的是位于oa [0]的对象
  (oa的第一个索引)。如果该行是oa = null,那将是真的,
  并且无论oa中唯一的项目是否为null,实际上都不会
  使包装器(在这种情况下为数组)为空。类似于拥有一个
  列出并清空其所有元素不会使列表为空。

07-24 20:28