Java中的赋值运算符

Mil*_* Lu 0 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

双方ab都朝着同一个内存指针.当b超出范围时,应该释放分配的内存并且a应该变为空,对吧?或者它是基于引用计数方法,b被删除但内存仍然存在?

awk*_*ksp 8

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

因此,当b超出范围时,由于仍然可以访问a该数组,因此不会释放该数组.

Java中没有使用引用计数,但至少在这种情况下,我认为它将与Java的GC具有相同的效果.Jon Skeet在这个答案中触及了这个主题,并说它没有被使用,因为它不利地影响了性能并且在对象图中没有循环.Brad Abrams的这篇文章对此进行了扩展.


Jam*_*mes 5

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