根节点是垃圾回收可达性分析的起点,包括全局对象、当前执行上下文的局部变量与参数、调用栈中所有活跃函数的上下文,以及宿主环境提供的活跃引用(如dom元素、定时器回调等),每次gc时动态构建。

window 或 globalThis,Node.js 中是 global。所有挂载在全局对象上的属性(如 window.foo、var x = 1 声明的变量)都属于根,只要没被显式删除或覆盖,就持续参与可达性判定。
当前执行上下文中的局部变量和参数
函数正在运行时,其作用域内的变量、形参、临时绑定(包括 let/const 声明的块级变量)全部算作根。哪怕只是刚进入函数、还没执行到某一行,只要变量已声明且在活跃调用栈中,就计入。
调用栈上所有活跃函数的上下文
不仅限于当前函数,还包括所有尚未返回的外层函数——它们的词法环境、闭包捕获的自由变量,都会被纳入根集合。例如一个嵌套函数返回了内部函数,只要该内部函数仍被引用(比如赋给了全局变量),它所捕获的外部变量就依然可达。
某些宿主环境提供的活跃引用
比如浏览器中已挂载的 DOM 元素(document.body 及其子树)、定时器回调(setTimeout 中未执行完的函数)、事件监听器绑定的对象、Web Worker 的通信通道等。只要宿主环境认为这些对象还在使用中,就会把它们作为隐式根加入遍历起点。
这些根不是静态列表,而是每次 GC 触发时动态快照的结果。引擎会实时扫描调用栈和全局环境,构建当下的根集合,再开始标记阶段。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











