You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:57:25