我对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'吗?
答案 0 :(得分:5)
不,它没有,因为有一个根引用(堆栈变量C
),它对新的myList
有一个强引用(ArrayList
)。在main()
返回后,C1
和ArrayList
可以收集,因为根引用会消失。
答案 1 :(得分:2)
HotSpot的JIT实际上有一个优化,它正在检测不再访问本地var并在那一刻清除它的点。所以对你的问题的完整答案是“它可能,但不能保证”。最近我玩了一些代码并测量了大阵列所占用的内存。直到我在方法的最后插入array.hashCode()
,我发现它早先被释放了。