Java 当我们创建一个数组数组时,有多少对象符合垃圾收集器的条件?

Java 当我们创建一个数组数组时,有多少对象符合垃圾收集器的条件?,java,garbage-collection,Java,Garbage Collection,在第3行之后,有多少对象符合垃圾收集器的条件,这让我有点困惑。我已经搜索了有关此问题的解决方案,但我对找到的答案并不满意。好的,让我们逐行检查一下: 您可以创建一个新的int 2D数组: public class GarbageCollectionTest{ public static void main(String...args){ int [][]a = new int[4][3];//line 1 a[0] = new int[2];// lin

在第3行之后,有多少对象符合垃圾收集器的条件,这让我有点困惑。我已经搜索了有关此问题的解决方案,但我对找到的答案并不满意。

好的,让我们逐行检查一下:

您可以创建一个新的int 2D数组:

public class GarbageCollectionTest{

    public static void main(String...args){
        int [][]a = new int[4][3];//line 1
        a[0] = new int[2];// line 2
        a[2] = new int[3];// line 3
        a = new int[3][2];  //line 4
    }
}
您可以替换一个阵列中的两个阵列:

int [][]a = new int[4][3];//line 1
重新分配并创建新阵列:

a[0] = new int[2];// line 2
a[2] = new int[3];// line 3
在第3行之后,将拾取第2行和第3行中替换的两个阵列

在第4行之后,垃圾收集器将拾取放置在“旧”a中的每个对象(数组),因此有4个对象(int是不是对象,请参见Konstantins答案)

4+2+对“旧”a本身的引用=总共7


我希望我做对了;)

当您的程序不再具有对对象的任何引用时,而不是在创建对象时,就会发生垃圾收集,因此“当我们创建数组数组时”,垃圾收集不会发生任何事情

基本体的二维数组,如
int[][]
,由一个对象数组组成,其中包含对n
int[]
数组的引用(其中n是外部数组的大小-示例第1行中的4)。当您将该二维数组指定给
a
时,您将创建一个从
a
到外部数组的引用,然后再到内部基元数组的引用,因此垃圾收集器不会删除任何这些对象

第二行构造一个新的
int[]
,然后将其分配给外部数组的第一个索引。此分配(而不是数组的创建)导致先前分配给索引
0
int[]
符合垃圾收集的条件,因为不再有任何方法引用它-它是“垃圾”

第三行是相同的,您构造一个新的
int[]
,然后将其分配给一个索引,删除对先前引用的数组的唯一引用。它现在也有资格被收集。所以在第三行之后有两个
int[]
对象可以被收集

第四行构造一个新的
int[]]
,执行与上面相同的工作(一个对象数组包含n个
int[]
数组),然后将该数组分配给
a
,从而删除对前一个二维数组的唯一引用。此时,GC可以看到没有任何东西引用旧数组并将其清除。一旦发生这种情况,内部数组也就没有剩余的引用,GC也可以清理这些引用


在第四行之后,您仍然可以通过
a
引用这个新数组,并依次引用它包含的数组。您先前构建的阵列不再可访问,因此最终将由GC清理。一旦GC有机会运行,内存中剩下的就是
a
引用的数组,以及它依次引用的内部数组。

您的意思是在执行第4行之后吗?嗯,您重新分配了两个对象,所以我假设您有两个对象(两个数组)可用于垃圾收集。关于垃圾收集,您到底想了解什么?一般来说,GC只是“做正确的事情”,并清理您不再引用的对象。
a = new int[3][2];  //line 4