class App{
int[] a;
private void firstFunction(){
int[] b = {1, 2, 3, 4};
a = new int[4];
a = b;
}
private void secondFunction(){
for(int i=0; i<a.length; a++) System.out.println(a[i]);
}
}
a
和b
都是指向同一内存的指针。当b
超出范围时,应释放已分配的内存,a
应为空,对吧?或者它基于引用计数方法,删除b
但内存仍然存在?
答案 0 :(得分:8)
都不是。 Java的垃圾收集基于可达性 - 是否可以通过某些已知起点的某些引用链来访问对象。更多信息from Oracle
因此,当b
超出范围时,由于数组仍可通过a
访问,因此数组不会被释放。
Java中没有使用引用计数,尽管至少在这种情况下我认为它将具有与Java的GC相同的效果。 Jon Skeet在this回答中触及了这个主题,并说它没有被使用,因为它对性能产生了不利影响,并且对象图中的循环失败了。 Brad Abrams的This帖子对此进行了扩展。
答案 1 :(得分:5)
根据定义,垃圾收集仅释放不再引用的内存。在这种情况下,显然 a 仍在引用数组。