前端垃圾回收机制

一、概述

垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。
垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。
但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行

调用栈中的数据如何回收

在调用栈中,有一个记录当前执行状态的指针(ESP),通过栈中下移指针完成已执行完成的函数的执行上下文的销毁,
新函数执行,新函数的执行上下文入栈,直接覆盖内存。

引用数据(堆)中的数据如何回收

代际假说

代际假说(The Generational Hypothesis)

1、大部分对象在内存中存在的时间很短;
2、不死的对象,会活得更久;

分代收集

现在V8浏览器会把堆分为新生代老生代两个区域

新生代中存放的是生存时间短的对象,老生代中存放的生存时间久的对象

新生代 - 副垃圾回收器

一般新创建的对象都在新生代中,新生代中用Scavenge 算法来处理

把新生代空间对半划分为两个区域,一半是对象区域,一半是空闲区域

新加入的对象都会放到对象区域,当对象区域快被写满时,就执行一次垃圾清理操作。

在垃圾回收过程中,首先要对对象区域中的垃圾做标记;标记完成之后,就进入垃圾清理阶
段,副垃圾回收器会把这些存活的对象复制到空闲区域中,同时它还会把这些对象有序地排
列起来,所以这个复制过程,也就相当于完成了内存整理操作,复制后空闲区域就没有内存
碎片了

老生代 - 主垃圾回收器

在新生代中一般存活超过两次垃圾回收机制的对象会晋升到老生代。除此之外,一些大的对象会直
接被分配到老生区。主垃圾回收器是采用标记 - 清除(Mark-Sweep)的算法进行垃圾回收的

首先是标记过程阶段。标记阶段就是从一组根元素开始,递归遍历这组根元素,在这个遍历
过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据。

标记 - 整理(Mark-Compact)

因为标记 - 清除容易产生大量内存碎片,所以对此优化出标记 - 整理(Mark-Compact)

标记过程仍然与标记 - 清除算法里的是一样的,但后续步骤不是直接对可回收对象进行清理,而是让所
有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

增量标记(Incremental Marking)

如果有很多对象,并且我们试图一次遍历并标记整个对象集,那么可能会花费一些时间,并在执行中会有一定的延迟。
因此,引擎试图将垃圾回收分解为多个部分。然后,各个部分分别执行。这需要额外的标记来跟踪变化,这样有很多微小的延迟,而不是很大的延迟。

总结

不论什么类型的垃圾回收器,它们都有一套共同的执行流程,只是表现形式不一样

  • 标记空间中活动对象和非活动对象。所谓活动对象就是还在使用的对象,非活动对象就是可以进行垃圾回收的对象
  • 回收非活动对象所占据的内存
  • 内存整理。也就是将回收后的内存碎片进行整理。新生代在复制过程中完成,老生代为此还会再一次遍历堆进行移动整理

参考资料

浏览器工作原理与实践 - 李兵

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值