关于Java对象生命周期,下列代码运行后有多少对象符合垃圾回收条件? ``` class Node { Node next; } void create() { Node n1 = new Node(); Node n2 = new Node(); n1.next = n2; n2.next = n1; n1 = null; Node n3 = new Node(); } ```
答案解析
### 核心考点说明
本题考察循环引用场景下的垃圾回收判定,需理解可达性分析算法和GC Roots概念。
### 解题思路分析
1. `n1`与`n2`形成循环引用,但`n1`被置为null后失去GC Roots引用
2. `n3`在方法结束时仍被局部变量引用(未置null)
3. 方法内创建3个对象:n1原对象、n2、n3
### 选项详细分析
- **A**:错误。认为循环引用阻止回收,但Java使用可达性分析而非引用计数
- **B**:正确。n1原对象和n2因无GC Roots引用可被回收
- **C**:错误。误将n3算入可回收对象,但方法未结束前n3仍被引用
- **D**:错误。所有对象均被错误标记为可回收
### 易错点提醒
- 循环引用对象若无GC Roots可达,仍会被回收
- 局部变量在方法执行期间始终持有引用
正确答案:B