JavaScript垃圾回收机制简介

# JS垃圾回收机制

## 什么是垃圾回收 JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

## 垃圾回收算法 JS中常用的垃圾回收算法有两种:引用计数和标记清除。

### 引用计数 引用计数是一种简单直观的算法,它的原理是给每个对象分配一个引用计数器,当对象被创建时,计数器初始化为1,当对象被其他对象引用时,计数器加1,当对象被其他对象解除引用时,计数器减1,当计数器为0时,表示该对象没有任何引用,可以被回收。 引用计数的优点是可以及时地回收无用对象,避免占用过多内存。缺点是需要维护额外的空间来存储引用计数器,并且无法处理循环引用的情况。

例如:

```js

let a = {};

let b = {};

a.b = b;

b.a = a;

上面的代码中,a和b互相引用对方,导致它们的引用计数都为2,即使它们已经没有其他变量指向它们了。这样就会造成内存泄漏。

标记清除

标记清除是一种更智能的算法,它不需要维护额外的空间来记录每个对象的引用情况。它分为两个阶段:标记和清除。

在标记阶段,从根对象(如window)开始遍历所有可达对象,并给它们打上一个标记。在清除阶段,遍历所有对象,并把没有标记的对象视为垃圾进行回收。

标记清除算法可以解决循环引用问题,并且更节省空间。但是它也有一些缺点:首先,在遍历和清理过程中会暂停程序执行;其次,在清理后可能会产生内存碎片;最后,在某些情况下可能会误判某些活动对象为死亡对象。

V8 的垃圾回收机制

V8 是 Chrome 浏览器使用的 JS 引擎。V8 的垃圾回收机制采用了分代式和增量式相结合的方式。

分代式

分代式指将内存分为新生代和老生代两部分。新生代指存放短期存在或者频繁变化的小对象;老生代指存放长期存在或者稳定不变的大对象。

V8 会根据对象的存活时间和大小,将它们分配到不同的区域,并采用不同的回收策略。新生代区域使用副垃圾回收器,老生代区域使用主垃圾回收器。

增量式

增量式指在执行垃圾回收时,不会一次性暂停程序执行,而是将回收任务分为多个小步骤,交替执行。这样可以减少程序的卡顿和延迟,提高用户体验。

V8 在老生代区域使用了增量式标记清除算法。它将标记阶段分为多个子阶段,并在每个子阶段之后让出控制权给 JS 程序。这样可以避免一次性遍历所有对象导致的长时间停顿。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值