Java GC在从作用域返回后收集引用的对象
我有一个关于GC在Java中如何工作的问题。 考虑下面的代码:Java GC在从作用域返回后收集引用的对象,java,garbage-collection,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&
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);
...
}
我的问题是:
在func返回后,GC是否释放“l1”?不,它不会释放,因为有一个根引用堆栈变量C,它有一个强引用myList,指向新的ArrayList。在main返回之后,C1和ArrayList是可收集的,因为根引用消失了。不,它没有,因为有一个根引用堆栈变量C,它有一个强引用myList,指向新的ArrayList。在main返回之后,C1和ArrayList是可收集的,因为根引用消失了。实际上HotSpot的JIT做了一个优化,即检测不再访问本地var的点并在那一刻清除它。因此,你的问题的完整答案是可能的,但不能保证。最近我玩了一些代码,测量了一个大数组占用的内存。直到我在方法的末尾插入array.hashCode之前,我观察到它是在更早的时候发布的。实际上HotSpot的JIT做了一个优化,即检测不再访问本地变量的点并在那一刻清除它。因此,你的问题的完整答案是可能的,但不能保证。最近我玩了一些代码,测量了一个大数组占用的内存。直到我在方法的末尾插入ARRAY.HASCODE,我才发现它早就发布了。是关于后面的主要结束的问题,或者你在想象中的其他与C严格无关的其他活动吗?不,考虑其他与C无关的活动。参考文献,ARARYLIST不是编译的东西。但是,ArayLead可能是关于后面的主要内容的问题,还是你设想的其他主要活动与C严格无关?不,考虑其他与C无关的活动。参考文献,ARARYLIST不是编译的东西。不过,ArrayList可能会。