Chrome V8引擎的垃圾回收机制

Chrome V8引擎的垃圾回收机制


0、JavaScript 垃圾回收器的利与弊
优点:
简化程序的内存管理,由垃圾回收机制自动管理内存,降低程序员的负担,以达到解决内存泄漏的目的;

缺点:
V8引擎的垃圾回收机制,不允许人为手动触发,无法对内存管理进行任何干预;

1、内存管理的必要性
1.1 V8引擎的垃圾回收机制运行在浏览器中
基本没有太多内存管理的必要
原因:
a.V8引擎实例的生命周期不长(谁没事一个页面开着几天几个月不关);
b.影响范围小(如果不幸发生内存泄露等问题,仅仅会影响到一个终端用户);
c.无论这个V8实例占用了多少内存,最终在关闭页面时内存都会被释放;
1.2 运行在服务器端(Node)
内存管理就十分必要了
因为一旦发生内存泄漏,就会导致整个服务系统瘫痪;

2、Chrome内存大小的限制
之所以限制,是因为Chrome的垃圾回收机制的限制,V8在执行垃圾回收时会阻塞JS其他应用逻辑,直到垃圾回收结束。这样会使浏览器失去对用户的相应,造成假死现象。

3、V8的垃圾回收机制原理
3.1 判断标准
一个对象为活对象当且仅当它被一个根对象或另一个活对象指向;
根对象永远是活对象;
3.2 哪些是根对象?
全局对象:如Node的global,浏览器中的window;
被局部变量所指向的对象也属于根对象,因为它们所在的作用域对象被视为根对象;

4、V8的分代回收策略(新生代和老生代)
3.1 新生代垃圾回收策略
3.1.1 新生代特点
大多数对象被分配到这里;
区域小;
垃圾回收频繁;
3.1.2 算法思想
将内存一分为二,一个叫From空间,另一个叫To空间;
将From空间中的活跃对象复制到To空间中;
释放From空间的非活跃对象;
然后From空间与To空间角色互换;
循环下去;
3.1.3 算法特点
a) 会不会浪费很多内存?
虽然浪费一半内存,但因为新生代内存空间较小,所以浪费的并不多。
b) 会不会来回复制导致效率低下?
因为新生代内存空间中绝大多数是非活跃对象,所以复制的比例很小,效率并不低。
具体例子见转发连接
3.2 如何判断一个仅仅被老生代对象指向的新生代对象是否存活?
特点:
仅被一个对象指向;
还是个老生代对象;
如何判断?
为了解决这个问题,需要建立一个列表用来记录所有老生代对象指向新生代对象的情况。每当有老生代对象指向新生代对象的时候,我们就记录下来。
3.3 新生代对象晋升老生代的标准
a) 经历过新生代的垃圾回收清理,会复制到老生代内存中;
b) 从From空间复制到To空间,如果To空间的使用超过25%,直接复制到老生代中;

3.4 老生代垃圾回收策略
3.4.1 老生代特点
生存周期较长或常驻内存的对象;
3.4.2 算法思想
Mark-Sweep(标记清除)+Mark-Compact(标记整理)相结合
标记清除:清理非活跃对象;
标记整理:解决标记清除带来的内存碎片化的问题;

阅读更多
文章标签: V8垃圾回收机制
个人分类: Web 前端
上一篇Mongoose
下一篇node.js之fs模块
想对作者说点什么? 我来说一句

Chrome浏览器v8引擎源代码

2009年04月27日 4.94MB 下载

没有更多推荐了,返回首页

关闭
关闭