GC从范围返回后收集引用的对象

时间:2012-07-02 14:48:07

标签: java garbage-collection

我对GC如何在Java中工作有疑问。 请考虑以下代码:

class C1 {
    ArrayList<int> myList = new ArrayList<int>();

    public void setList(ArrayList<int> l) {
         myList = l;
    }
}

func(C1 C) {
    ArrayList<int> l1 = new ArrayList<int>();
    l1.add(1);
    C.setList(l1);
}

main() {
    C1 C = new C1();
    func(C);
    ...
}

我的问题是: GC会在func()返回后发布'l1'吗?

2 个答案:

答案 0 :(得分:5)

不,它没有,因为有一个根引用(堆栈变量C),它对新的myList有一个强引用(ArrayList)。在main()返回后,C1ArrayList可以收集,因为根引用会消失。

答案 1 :(得分:2)

HotSpot的JIT实际上有一个优化,它正在检测不再访问本地var并在那一刻清除它的点。所以对你的问题的完整答案是“它可能,但不能保证”。最近我玩了一些代码并测量了大阵列所占用的内存。直到我在方法的最后插入array.hashCode(),我发现它早先被释放了。