聊聊Javascript 垃圾回收机制(二)-V8引擎下的垃圾回收机制.docx
《聊聊Javascript 垃圾回收机制(二)-V8引擎下的垃圾回收机制.docx》由会员分享,可在线阅读,更多相关《聊聊Javascript 垃圾回收机制(二)-V8引擎下的垃圾回收机制.docx(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、引子从修真故事说起上文大概介绍了垃圾回收的机制和标记清除法的核心思路,接下来准备深入介 绍下v8引擎里的垃圾回收算法。既然是算法类的介绍,那自然是比拟枯燥的, 如果想完全弄懂,可以收藏下来,多看几遍(!_!)。为了缓解一下讲解的枯燥,我觉得可以先从一个比拟有意思的话题来引入。相 信大家都看过一些修真玄幻的小说,渡劫和飞升就是里面常见的桥段,现在来 给大家讲个故事:初始大陆上有很多普通的修真者在修仙,随着时间推移,人数越来越多,最终到 达了这个大陆的承受极限,此时天道必然要出手掌握平衡,从中选拔留下一下 能通过考验的优秀之人,清除掉剩下的修为低下之人,从而腾出大陆空间;天 道选拔的方式是:将这些
2、人挪移到渡劫空间里,然后开始一场小天劫,等到小天劫结束后,再把活下 来的人送回大陆空间,没有渡过的人就会被清除,身死道消; 循环往复,只要每次人数到达大陆空间上限,都会进行一次小天劫,那么这之中就会有度过数次天劫的佼佼者,天道会奖励他飞升到更高级、更广 阔的远古大陆去,踏上更高一级的修炼路程,但是我们知道,修仙之路是逆天之 路,更高级的地方自然也有更高级的劫数,远古大陆虽然更加辽阔,远胜于初始 大陆,但是每隔一定的时间,也会触发一次更大级别的大天劫,清理这个大陆 上的修真者。大局部的修真者生命是短暂的,熬不过一两次小天劫,只有少数的修真者能够脱 颖而出,飞升到远古大陆。故事暂时就讲到这里,接下
3、来就是正题。堆结构的划分在聊垃圾回收之前,要先了解下v8引擎对于堆结构的划分:1 .新空间(New-space):大多数对象都分配在这里。新空间很小,并且被设计为可以非 常快速地进行垃圾回收,而与其他空间无关。其实这个新生空间对应的,就是前文 的初始大陆2 .旧指针空间(Old-pointer-space):包含大多数对象,这些对象可能具有指向其他对 象的指针。在新空间中生存了一段时间后,大多数对象都移到了这里。(特例也可 以先不管)3 .旧数据空间(Old-data-space):包含仅包含原始数据的对象(没有指向其他对象的 指针)。在新空间中存活了一段时间后,字符串,装箱的数字和未装箱的双
4、精度数 组会移到此处。旧指针空间和旧数据空间合起来就称为旧空间,就对应前文的远古 大陆。4 .大对象空间:此空间包含的对象大于其他空间的大小限制。大对象永远不会被垃圾 收集器移动。(可以先不管)5 .代码空间:此处分配了包含JIT指令的代码对象。这是唯一具有可执行内存的空间 (尽管可以在大对象空间中分配代码,并且这些代码也是可执行的。(可以先不管)介绍到这里,相信有些同学已经可以对应出一局部内容了,接着往下看(主要先 记住前面3个空间就好,后面会一直用到):分代回收机制(Generational collection)在大局部小说设定里,普通修真者的生命总是短暂的,能脱颖而出的万中无一。 在大
5、局部程序里,对象数据的生命也是短暂的,只有少局部数据对象会长期存活。 所以根据这种情况,v8引擎设计了分代回收的方式-也就是前面提到的:天劫 分一大一小两类,小天劫发生频繁,清扫新生和普通的修真者,只在初始大陆 发生;大天劫间隔更久,清理远古大陆的修真者,他们分别发生在不同的空间, 共同完成垃圾回收任务。整体配合机制如下:1 .在新空间分配新对象,直到空间充满,就触发小型回收机制;2 .在小型回收机制中存活下2次的对象,就会被移动到旧空间去(根据数据特点分配 到旧指针空间或者旧数据空间);3 .旧数据空间内存到达一定值的时候(这个阈值具体的参数先不用关注),触发大型 回收机制(major ga
6、rbage collection);(可以再去回头读读前面的故事 是不是基本全对上了!)接下来我们来分别介绍这两种机制。小型回收机制scavenge小型回收机制,官方名称是scavenge,它发生概率频繁,所以要求速度要比拟 快。基本算法思路源于著名的Cheney算法,思路如下:1 .把新空间融cw-卯均分为两局部,命名为from空间和to空间;(这两个空间不会同时使用)2 .前面说的新对象的分配是在to空间进行的,直到填满to空间为止;3 .此时交换空间和土。空间,也就是把to空间的所有对象都移动到空间,这一步执行完后,to空间变成空的,f/OM是满的;4 .在空间,从“元开始寻找所有可访问
7、对象(这是上一篇的内容了,忘记了可 以去回顾一下),然后把这些对象都移动到仇空间或者。回空间(某些已经挨过两 次的就应该飞升了),这一步其实,8引擎还会顺便做一下压实(compacted),也就 是把存活的对象位置稍微集中一下,增加一下缓存的局部性,保持分配快速而简单;5 .清空空间(筛选剩下的都是可回收的了);第一次接触这个算法的读者可能稍微有点绕,也会疑惑为什么不直接在to空间 满了的时候就直接清理垃圾,保存We对象(也就是可访问对象),反而要移来移 去的;其实多看两遍就很好理解了,这样设计的好处在于仇空间永远作为实际 的内存分配空间,仇充当的只是一个临时容器,也就是渡劫的空间,两者不 需
8、要同时使用,这样非常清晰。官方还贴了一份伪代码:def SMve八gc():toSpace)allocatioiPtr = toSpace.bottomscaPtr = toSpace.bottomfor i =。.怙八(roots):root = rootsiif iiFroMSpace(root):rootCopy = copyObjec&callocatioiPtr, root)setForw4KdihgAddress(rootj rootCopyrooti = rootCopywki/c scaiPtr allocatioiPtr:ohj = object at scaiPtrscai
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 聊聊Javascript 垃圾回收机制二-V8引擎下的垃圾回收机制 聊聊 Javascript 垃圾 回收 机制 V8 引擎
限制150内