为何将arr2d设为null后垃圾回收的对象数量为4?
为什么将arr2d设为null后有4个对象被垃圾回收
要搞清楚这个问题,核心是梳理对象的引用链:Java的垃圾回收只会回收完全失去可达引用的对象,你需要逐个排查代码中所有通过new创建的实例,看在arr2d = null之后,哪些对象再也没有任何变量或其他对象能引用到它们。
对应答案为4的典型场景是:
假设arr2d是一个二维数组,它的结构满足以下条件:
- 外层数组包含2个一维数组,每个一维数组中存储了2个仅被当前一维数组引用的对象(比如
new Integer(1)这类没有其他外部引用的包装类/自定义类实例)。 - 这两个一维数组没有被除arr2d之外的任何变量引用。
当执行arr2d = null后,原本通过arr2d建立的引用链被完全切断:四个内部的包装类/自定义类实例失去了所有可达引用,因此会被垃圾回收。(如果题目默认不统计数组对象本身,就会得到4这个答案;若统计数组对象,总数会更多,但这类练习题通常聚焦业务对象的回收数量)
你可以按照这个思路,回头核对原题代码中的引用关系,就能明确为什么是4个对象被回收。
内容的提问来源于stack exchange,提问作者CrowdStrife
相关产品推荐
相关产品推荐

