前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS 的垃圾回收机制

JS 的垃圾回收机制

原创
作者头像
黄啊码
修改2022-07-15 12:17:55
2.1K0
修改2022-07-15 12:17:55
举报

在JS中,对于任何变量、对象、数组、实例等等这些,都会消耗我们的内存和资源,为了节省资源和提高速度,在JS中,他是如何处理我们已经不再使用的变量数组等呢?

一、什么是内存泄漏

程序的运行需要内存,程序运行中的各种操作需要消耗资源和内存,程序运行中生成的各种数据也需要内存。若不及时释放内存,则内存的占用越来越高,轻则影响程序和系统的性能,重则导致进程或系统的崩溃。 没有即使释放不再使用的内存,就称为内存泄漏。 对于有的语言能够进行自动化内存管理,称为垃圾回收机制

二、哪些内容是“垃圾”?

JS的垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存。 很简单,对于我们不再使用的内容,就会视为垃圾处理掉。而对于不再使用的值,则会被垃圾回收。(注意可访问性)

  • 有用的值:
    • 本地函数的局部变量和参数
    • 调用链上的其他函数的变量和参数
    • 全局变量
    • 可访问的值
  • 无用的值:
    • 地址或值为 null 的值
    • 函数的局部作用域中的变量和参数(函数完成后)

等等等等。

三、JS回收方式

1. “标记” 清除

这是JS中最常用的垃圾回收方式,它通过给所有的变量都标上一个标记,然后再追溯到他们的引用并继续标记,就这样一直标记下去,一直到有未访问(不可访问)的引用为止,除了标记了的对象以外,其他所有对象都被删除。

  • 每个对象都不会被标记两次
  • 从根访问开始标记

例如:(图片来源:思否.前端小智

这是一个对象结构: 看看垃圾回收机制的流程

image.png
image.png

第一,从根开始标记:

image.png
image.png

第二,标记他们的引用:

image.png
image.png

第三,标记他们子孙代的引用,以此类推:

image.png
image.png

第四,除了标记的对象以外,其他所有对象都被删除:

image.png
image.png

这就是垃圾回收机制的原理。JS中还有许多对此的优化:

  • 分代回收:对对象的标记分为两组:“新对象”与“旧对象”,对于新对象,就是经常出现且迅速处理重复的工作,这种对象会被经常检查且很快就被清理,而“旧对象”,就是那些存活非常久的对象,接受检查的次数也就会越少。
  • 增量回收:若对象数量较大,一次遍历整个对象集则会花费一些时间,且执行过程中会有一定的延迟。因此,JS引擎试图把垃圾回收机制拆分,然后在各个部位分别执行,以用来减少延迟。
  • 空闲时间手机:垃圾回收器只在 CPU 空闲时运行,减少对执行影响的可能性

2. 引用计数

根据被引用的次数。 当声明一个变量并将一个引用类型赋值给该变量时,这个值得引用次数就 +1,相反,如果包含对这个值引用的变量又取得了另外一个值,这个值得引用次数就 -1,当这个值得引用次数变为0的时候,就说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。 这样,垃圾收集器下次再运行时,就会释放哪些引用次数为0所占的内存。 但这样会存在一些问题:

代码语言:javascript
复制
function problem(){
    var objA = new Object();
    var objB = new Object();
    
    objA.someOtherObject = objB;
    objB.someOtherObject = objA;
}
复制代码

上面的代码里,objAobjB通过各自的属性相互引用着,那他们的引用次数将一直是 2,再引用计数策略中,函数执行完后,使用的是 varobjAobjB还将会存在,所以造成了内存泄漏。需要手动切断他们的循环引用。

四、总结

对于JS垃圾回收机制,自然是越少越好,当然是垃圾的生成越少越好,我们可以用一些方法减少垃圾回收,例如手动进行内存释放:

代码语言:javascript
复制
let arr = [a,b,c,d,e,f];
arr.length;        // 将长度设置为0释放内存
let obj = {
    name: "小明",
    age: 18,
}
obj = null;        // 清除引用释放内存
// 等等。。。
复制代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是内存泄漏
  • 二、哪些内容是“垃圾”?
  • 三、JS回收方式
    • 1. “标记” 清除
      • 2. 引用计数
      • 四、总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档