Java中的赋值运算符

时间:2014-06-30 21:26:53

标签: java arrays pointers memory-management

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]);
    }
}

ab都是指向同一内存的指针。当b超出范围时,应释放已分配的内存,a应为空,对吧?或者它基于引用计数方法,删除b但内存仍然存在?

2 个答案:

答案 0 :(得分:8)

都不是。 Java的垃圾收集基于可达性 - 是否可以通过某些已知起点的某些引用链来访问对象。更多信息from Oracle

因此,当b超出范围时,由于数组仍可通过a访问,因此数组不会被释放。

Java中没有使用引用计数,尽管至少在这种情况下我认为它将具有与Java的GC相同的效果。 Jon Skeet在this回答中触及了这个主题,并说它没有被使用,因为它对性能产生了不利影响,并且对象图中的循环失败了。 Brad Abrams的This帖子对此进行了扩展。

答案 1 :(得分:5)

根据定义,垃圾收集仅释放不再引用的内存。在这种情况下,显然 a 仍在引用数组。