JS的内存管理

JavaScript的内存管理包括自动分配和释放内存。基本数据类型存储在栈中,复杂数据类型(对象)存储在堆中,通过引用(指针)访问。垃圾回收(GC)通过引用计数或标记清除算法回收不再使用的对象,V8引擎使用优化的标记清除算法来高效管理内存。
摘要由CSDN通过智能技术生成

什么是内存管理

不管使用什么样的编程语言,在代码的执行过程中,都需要给它分配内存。有些语言会让我们手动管理,有些会自动帮助我们管理内存。

内存管理的生命周期

  1. 分配申请你需要的内存(申请)
  2. 使用分配的内存
  3. 不需要使用时,对其进行释放 (防止栈用尽等问题)

不同编程语言一、三步的不同实现

手动管理:比如C,C++ 需要手动给管理(maloc和free函数)

自动管理:比如Java,JS,Python会自动帮助我们管理

JS的内存管理

一般而言JS在定义变量时就帮助我们自动分配内存了。JS的基本数据类型会在执行时,分配在栈里面。

复杂的数据类型(对象等)会被存放在堆空间里。这个变量有一个引用(形如0x100这种十六进制的地址)指向内存堆里的位置。 这个引用我们也叫它指针。

image.png

JS的垃圾回收

对于那些不再使用的对象,我们称之为是垃圾,需要被回收,以释放更多的内存空间。
垃圾回收器我们简称为GC。

GC常用的算法

引用计数算法

某一对象设置一个存储计数器,只要有一个引用指向它,计数器就+1。如果计数器变为0的话内存就回收该对象。

但是引用计数算法存在一个问题,
循环引用

就像一个双向链表一样,双方指针互相指向。

image.png

解决方法是给某一对象指针(引用)设为Null

标记清楚算法

该算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找到从根开始有引用到的对象,对于那些没有引用到的对象,就认为是不可用的对象。他可以很好的解决事件循环的问题。

image.png

如图 M N 就不可达

V8引擎采用的就是标记清楚,但是为了更好的优化,在这个算法上又增加了一些新的算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值