【js】js垃圾回收是什么?

时间:2021-7-5 作者:qvyue

长久不用的一些在内存中的变量会被浏览器回收掉,具体的咋回收的呢

GC——垃圾回收

找出不再使用的变量,然后释放掉占用的内存;因此垃圾回收器会定期的执行。

var a = "造火箭";
var b = "拧螺丝";
var a = b;

造火箭这个字符串失去了引用(之前是被a引用),系统检测到之后,就会释放该字符串的储存空间,以回收利用

如何知道,到底哪些内存可回收?

一个循环引用的🌰:

function cycle() {
    var o1 = {};
    var o2 = {};
    o1.a = o2;
    o2.a = o1; 

    return "cycle reference!"
}

cycle();

1.标记清除

标记阶段:从根部开始,逐层往里遍历,遍历到堆中的对象时,说明有被使用,立马打上标记,继续往下遍历直到最深的一层节点
清除阶段:遍历整个堆,回收没有打上标记的对象。

  • 可以解决循环引用问题,因为两个对象从全局对象出发无法获取。因此,他们无法被标记,他们将会被垃圾回收器回收
  • 是否加标记,只需要分两种情况做标志位,节省空间

所以现在对于主流浏览器来说,只需要切断需要回收的对象与根部的联系。

2.引用计数 (现代浏览器不常用了)

优点和原理:

  • 即刻回收,当被引用次数为0时,对象马上会把自己作为空闲空间连到空闲链表上,也就是,在变成垃圾的时候就立刻被回收。
  • 因此就不用去遍历堆里面的所有活动对象和非活动对象

劣势:

  • 万一被引用次数很大,需要很大内存来储存记录的次数;
  • 循环引用无法解决,因为他们的被引用次数,均不会为零
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。