JavaScript底层内存工作原理及垃圾回收相关疑问咨询
关于JavaScript内存机制与垃圾回收的清晰解析
嘿,我完全懂你这种快被问题搞疯的感觉——这种底层内存问题确实容易绕进去,咱们一步步拆解清楚!
首先要给你吃个定心丸:你对《Eloquent Javascript》那段内容的理解完全正确,而且用C语言的变量/指针类比来理解JS内存,是非常棒的思路!
一、对象在内存中的存储逻辑
先拿你举的例子来拆解:
// Address is 0xA var number = 4; // Variable address is 0xB, say address of object is 0xC var obj = { array: [1, 2, 3], literal: 3 };
这段代码的内存布局和你想的一致,而且可以再细化:
- 地址
0xA:直接存储原始值4的二进制位(也就是你说的100),这是变量number的实际值; - 地址
0xB:存储的是对象的引用地址0xC,变量obj本身只是这个地址的“别名”; - 地址
0xC:这就是对象的本体内存区域,它本质是一个键值对集合:literal属性:直接存储原始值3的二进制位,没有额外引用;array属性:存储的是另一个内存地址(比如0xD),这个地址指向数组的本体;
- 地址
0xD:数组的本体(数组是特殊对象),它的索引0、1、2分别直接存储原始值1、2、3的二进制位。
所以你最后的结论完全正确:JS内存是通过引用链式指向内存区域,直到遇到原始值才终止——所有对象(数组、函数、正则等)都是引用,最终都会指向直接存储值的原始值,原始值是整个引用链的终点。
二、关于“释放内存”的准确理解
“释放内存”其实是三个动作的组合,但核心是回收不再被使用的内存区域:
- 第一步:标记“垃圾”——JS引擎会从全局对象(比如浏览器的
window)开始遍历所有可达引用,那些无法通过任何活跃引用链找到的内存区域,会被标记为“不再使用”; - 第二步:清除旧值——垃圾回收器会清除这些标记区域里的旧数据,避免残留内容干扰后续存储;
- 第三步:标记可复用——把这些内存区域标记为“可写入”,方便后续新的变量/对象使用。
简单说:变量名只是指向内存地址的标签,当没有任何标签(引用)指向某个地址时,这个地址里的内容就会被清理,内存空间也会被回收复用。
额外补充:和C语言的类比
你学过C语言,这个类比能帮你更清晰:
- JS的原始值 ≈ C语言栈上的基本类型变量(直接存值);
- JS的对象引用 ≈ C语言的指针(存内存地址);
- 区别在于JS把内存管理(malloc/free)完全封装了,不用你手动操作,垃圾回收器会自动处理这些细节。
内容的提问来源于stack exchange,提问作者Lawrence Beutlich
相关产品推荐
相关产品推荐

