1

我有一个关于 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”?

4

2 回答 2

5

不,它没有,因为有一个根引用(堆栈变量),它对newC有一个强引用 ( ) 。返回后,和是可收集的,因为根引用消失了。myListArrayListmain()C1ArrayList

于 2012-07-02T14:51:02.660 回答
2

实际上,HotSpot 的 JIT 做了一个优化,即检测本地 var 将不再被访问的点并在那个时刻清除它。因此,您问题的完整答案是“可能,但不能保证”。最近我玩了一些代码并测量了一个大型数组占用的内存。直到我真正array.hashCode()在方法的末尾插入,我观察到它是更早发布的。

于 2012-07-02T15:23:31.453 回答