Google V8剖析之垃圾回收

JavaScript 是一门自动垃圾回收的语言,开发者使用时并不需要手动回收垃圾数据,而是交由V8 的垃圾回收器自动完成。下边来具体看看V8垃圾回收机制。

1. 为什么需要垃圾回收

在Chrome中,v8被限制了内存的使用(64位约1.4G/1464MB , 32位约0.7G/732MB),限制的原因主要是V8最初为浏览器而设计,不太可能遇到用大量内存的场景,并且清理大量的内存垃圾是很耗时间,导致JavaScript线程暂停执行,产生卡顿。

2. 垃圾回收流程

垃圾回收大致可以分为以下几个步骤:
第一步,通过 GC Root 标记空间中活动对象非活动对象
采用可访问性(reachability)算法来判断堆中的对象是否是活动对象。具体地讲,就是将一些GC Root作为初始存活的对象的集合,从 GC Roots 对象出发,遍历 GC Root 中的所有对象:

  • 通过 GC Root 遍历到的对象,我们就认为该对象是可访问的(reachable),那么必须保证这些对象应该在内存中保留,我们也称可访问的对象为活动对象;
  • 通过 GC Roots 没有遍历到的对象,则是不可访问的(unreachable),那么这些不可访问的对象就可能被回收,我们称不可访问的对象为非活动对象。
    那么GC Roots 对象有哪些呢?
    在浏览器环境中,GC Root 有很多,通常包括了以下几种:
  • 全局的 window 对象(位于每个 iframe 中);
  • 文档 DOM 树,由可以通过遍历文档到达的所有原生 DOM 节点组成;
  • 存放栈上变量。

第二步,回收非活动对象所占据的内存。其实就是在所有的标记完成之后,统一清理内存中所有被标记为可回收的对象。

第三步,做内存整理。一般来说,频繁回收对象后,内存中就会存在大量不连续空间,我们把这些不连续的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值