将链表头节点指向第二个节点后,首个节点会被垃圾回收吗?
链表垃圾回收问题
代码示例
public class ListNode { public int val; public ListNode next; public ListNode(int val=0, ListNode next=null) { this.val = val; this.next = next; } public static void Main(){ ListNode head = new ListNode(5); ListNode curr = head; curr.next = new ListNode(6); curr = curr.next; curr.next = new ListNode(7); curr = curr.next; curr.next = new ListNode(8); curr = null; } }
问题描述
通过上述代码创建了一个链表,初始时head指向值为5的节点(即你说的节点1)。将head指向值为6的节点(节点2)后,节点1会被垃圾回收器回收吗? 注意此时节点1不再被任何标识符引用,但它的next指针仍指向节点2(非空对象)。
补充疑问:我认为GC会回收所有未被使用的空闲对象,但此处节点1仍与正在使用的链表相连,对此存在疑问。
解答
答案是:节点1会被垃圾回收器回收。
垃圾回收的核心判断依据是对象是否可达——也就是是否存在从GC根(比如当前栈中的变量、静态变量等)到该对象的引用路径。
当你把head改为指向节点2后,节点1不再被任何GC根引用:
- 原本的
head现在指向节点2,没有变量再指向节点1; - 节点1的
next指向节点2,但这是反向引用,GC不会因为节点1引用了可达对象就认为节点1本身可达。只有当存在从根到节点1的正向引用链时,节点1才会被标记为存活。
简单说:只要没有任何活跃的引用链能找到节点1,哪怕它还引用着其他可达对象,GC也会把它回收掉。
内容的提问来源于stack exchange,提问作者Yasir
相关产品推荐
相关产品推荐

