原始类型不参与垃圾回收,因其存储在栈内存中,作用域结束即自动释放。它们是值拷贝、无引用关系、不可变,引擎对长字符串或BigInt的堆内优化也由栈引用决定生命周期。

原始类型(如 number、string、boolean、null、undefined、symbol、bigint)在 JavaScript 中不参与传统意义上的“垃圾回收”过程,因为它们根本不会被分配到堆内存中,自然也不存在需要 GC 清理的引用对象。
原始类型存储在栈内存,作用域结束即释放
原始值直接存放在调用栈(stack)的执行上下文中。例如:
let a = 42;
let b = "hello";
let c = true;
这些变量的值本身就在栈上,空间固定、结构简单。当函数执行完毕、执行上下文出栈时,对应的栈帧被系统直接弹出——这块内存由底层运行时自动归还,无需 GC 干预。这个过程是瞬时、确定且开销极低的。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
没有引用关系,也就没有“可达性”判断
垃圾回收器只关心堆中的对象是否“可达”。而原始类型:
- 不保存在堆中,不产生引用地址;
- 赋值时是值拷贝,不是引用传递(let x = a; x = 99 不会影响 a);
- 无法形成循环引用或长生命周期持有链;
- 即便被闭包捕获,实际被捕获的仍是其副本,不影响原始存储位置。
字符串和 BigInt 的特殊说明
虽然 string 和 BigInt 属于原始类型,但因可能体积较大,某些引擎(如 V8)会对长字符串或大 BigInt 做内部优化,例如在堆中分配并缓存。不过:
- 这种分配对开发者完全透明;
- 引擎仍保证语义上是原始类型(不可变、值比较、无属性);
- 若真在堆中分配,其生命周期仍由栈中引用的消亡**决定**,一旦无栈变量指向它,就变成不可达对象,会被标记-清除算法正常回收。
你不需要、也不应该为原始类型做任何 GC 优化
常见误区包括:
- 给原始变量赋 null 或 undefined 试图“帮助 GC”——无效,栈变量本就会随作用域销毁;
- 认为 const str = "very long..."; 会导致内存泄漏——只要 str 离开作用域,它就没了;
- 用 delete 删除原始变量——语法错误,delete 只对对象属性有效。

















