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

浏览器学习之垃圾回收机制

作者头像
henu_Newxc03
发布2022-05-12 14:22:53
2430
发布2022-05-12 14:22:53
举报

V8的垃圾回收机制

V8实现了准确式GC,GC算法采用了分代式垃圾回收机制。因此,V8将内存(堆)分为新生代和老生代两部分。 (1) 新生代算法

新生代中的对象一般存活时间较短,使用Scavenge GC算法

在新生代空间中,内存空间分为两部分,分别为From空间和To空间。在这两个空间中,必定有一个空间是使用的,另外一个空间是空闲的。新分配的对象会被放入From空间,当From空间被占满时,新生代GC就会启动了。算法会检查From空间中存活的对象并复制到To空间中,如果有失活的对象就会被销毁。当复制完成后将From空间和To空间互换,这样GC就结束了。 (2)老生代算法

老生代中的对象一般存活时间较长且数量也多,使用了两个算法,分别是标记清除算法标记压缩算法

什么情况下对象会出现在老生代空间中:

  • 新生代中的对象是否已经经历过一次Scavenge算法,如果经历过,会将对象从新生代空间移到老生代空间中
  • To空间的对象占比大小超过25%。在这种情况下,为了不影响内存分配,会将对象从新生代空间移到老生代空间中

老生代中的空间很复杂,有如下几个空间

代码语言:javascript
复制
enum AllocationSpace {
// TODO(v8:7464): Actually map this space's memory as read-only.
	RO_SPACE, // 不变的对象空间
	NEW_SPACE, // 新⽣代⽤于 GC 复制算法的空间
	OLD_SPACE, // ⽼⽣代常驻对象空间
	CODE_SPACE, // ⽼⽣代代码对象空间
	MAP_SPACE, // ⽼⽣代 map 对象
	LO_SPACE, // ⽼⽣代⼤空间对象
	NEW_LO_SPACE, // 新⽣代⼤空间对象
	FIRST_SPACE = RO_SPACE,
	LAST_SPACE = NEW_LO_SPACE,
	FIRST_GROWABLE_PAGED_SPACE = OLD_SPACE,
	LAST_GROWABLE_PAGED_SPACE = MAP_SPACE
};

在老生代中,以下情况会先启动标记清除算法:

  • 某一个空间没有分块的时候
  • 空间中对象超过一定限制
  • 空间不能保证新生代中的对象移动到老生代中

在这个阶段中,会遍历堆中所有的对象,然后标记活的对象,在标记完成后,销毁所有没有被标记的对象。

清除对象后会造成堆内存出现碎片的情况,当碎片超过一定限制后会启动压缩算法,在压缩过程中,将活的对象向一端移动,直到所有对象都移动完成然后清理掉不需要的内存。

哪些操作会造成内存泄漏

  • 第一种情况是由于使用未声明的变量,而意外的创建一个全局变量,而使这个变量一直留在内存中无法被回收
  • 第二种情况是设置了定时器而忘记取消它,如果循环函数有对外部变量的引用的话,那么这个变量会一直留在内存中无法被回收
  • 第三种情况是获取一个DOM元素的引用,而后面这个元素被删除,由于我们一直保留了对这个元素的引用,所以它也无法被回收
  • 第四种情况是不合理使用闭包,从而导致某些变量一直被留在内存中
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • V8的垃圾回收机制
  • 哪些操作会造成内存泄漏
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档