
当将指向二维数组的引用设为null时,若该数组由1个外层数组和3个内层数组构成,则共4个数组对象满足垃圾回收条件;因int为基本类型,不参与gc,故回收对象数为4。
当将指向二维数组的引用设为null时,若该数组由1个外层数组和3个内层数组构成,则共4个数组对象满足垃圾回收条件;因int为基本类型,不参与gc,故回收对象数为4。
在Java中,二维数组本质上是“数组的数组”——即一个一维数组(外层数组),其每个元素又是一个一维数组(内层数组)的引用。它并非一块连续的内存块,而是由多个独立的对象组成,每个数组(无论维度)在堆中都作为单独的对象存在。
例如,以下声明创建了典型的“矩形”二维数组:
int[][] arr2d = new int[3][4]; // 外层数组长度为3,每个内层数组长度为4
这段代码实际在堆中分配了:
- 1个外层数组对象:类型为 int[][],包含3个 int[] 类型的引用;
- 3个内层数组对象:每个类型为 int[],各含4个 int 元素。
⚠️ 注意:int 是基本数据类型,其值直接存储在数组对象的内存空间中,不产生任何对象实例,因此不会被垃圾收集器追踪或回收。真正可被GC回收的,只有这 4个数组对象(1 + 3)。
立即学习“Java免费学习笔记(深入)”;
当执行 arr2d = null; 时:
- 原 arr2d 引用被清除;
- 若程序中再无其他活跃引用指向该外层数组及其所引用的3个内层数组(即无“强可达路径”),则这4个数组对象将同时变为不可达对象;
- 下一次垃圾回收周期中,它们将被统一回收(具体时机取决于GC策略,但可达性已丧失)。
✅ 关键判断逻辑(适用于所有类似题目):
- 统计所有通过该引用链直接或间接创建的数组对象数量(注意:不是元素个数,也不是基本类型值);
- 排除所有基本类型字段(如 int, boolean, char 等)——它们不占对象计数;
- 忽略未被显式创建的“隐式”数组(如未初始化的 arr2d[i] 为 null,则对应位置无内层数组对象)。
? 补充说明:若声明为 int[][] arr2d = new int[3][];(不指定内层数组长度),随后仅初始化其中2个(如 arr2d[0] = new int[2]; arr2d[1] = new int[5];),则总对象数为 1(外层)+ 2(已创建的内层)= 3个可回收对象——可见,必须结合实际创建行为分析。
综上,理解Java数组的对象本质,是准确判断GC数量的核心。牢记:每个 new 调用(只要成功返回)都创建一个独立对象;而基本类型永远不构成GC候选对象。










