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 节点组成;
- 存放栈上变量。
第二步,回收非活动对象所占据的内存。其实就是在所有的标记完成之后,统一清理内存中所有被标记为可回收的对象。
第三步,做内存整理。一般来说,频繁回收对象后,内存中就会存在大量不连续空间,我们把这些不连续的


220

被折叠的 条评论
为什么被折叠?



