理解垃圾回收机制首先要理解垃圾回收使用的算法。

1

V8主要的垃圾回收算法

垃圾回收策略主要基于分代式垃圾回收机制。垃圾回收算法中按对象的存活时间将内存的垃圾回收进行不同的分代,然后分别对不同分代的内存施以更高效的算法。

在V8中,主要将内存分为新生代和老生代两代。新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象。

2

Scavenge算法

在分代的基础上,新生代中的对象主要通过Scavenge算法进行垃圾回收。而在Scavenge的具体实现中,主要采用了Cheney算法。

Cheney算法是一种采用复制的方式实现的垃圾回收算法。它将堆内存一分为二,每一部分空间称为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用状态的semispace空间称为From空间,处于闲置状态的空间称为To空间。当我们分配对象时,先是在From空间中进行分配。当开始进行垃圾回收时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象占用的空间将会被释放。完成复制后,From空间和To空间的角色发生对换。

Scavenge的缺点是只能使用堆内存中的一半,这是由划分空间和复制机制所决定的。但Scavenge由于只复制存活的对象,并且对于生命周期短的场景存活对象只占少部分,所以它在时间效率上有优异的表现。

由于Scavenge是典型的牺牲空间换取时间的算法,所以无法大规模地应用到所有的垃圾回收中。但可以发现,Scavenge非常适合应用在新生代中,因为新生代中对象的生命周期较短,恰恰适合这个算法。

实际使用的堆内存是新生代中的两个semispace空间大小和老生代所用内存大小之和。

当一个对象经过多次复制依然存活时,它将会被认为是生命周期较长的对象。这种较长生命周期的对象随后会被移动到老生代中,采用新的算法进行管理。对象从新生代中移动到老生代中的过程称为晋升。

在单纯的Scavenge过程中,From空间中的存活对象会被复制到To空间中去,然后对From空间和To空间进行角色对换(又称翻转)。但在分代式垃圾回收的前提下,From空间中的存活对象在复制到To空间之前需要进行检查。在一定条件下,需要将存活周期长的对象移动到老生代中,也就是完成对象晋升。

对象晋升的条件主要有两个,一个是对象是否经历过Scavenge回收,一个是To空间的内存占用比超过限制。

在默认情况下,V8的对象分配主要集中在From空间中。对象从From空间中复制到To空间时,会检查它的内存地址来判断这个对象是否已经经历过一次Scavenge回收。如果已经经历过了,会将该对象从From空间复制到老生代空间中,如果没有,则复制到To空间中。

另一个判断条件是To空间的内存占用比。当要从From空间复制一个对象到To空间时,如果To空间已经使用了超过25%,则这个对象直接晋升到老生代空间中

设置25%这个限制值的原因是当这次Scavenge回收完成后,这个To空间将变成From空间,接下来的内存分配将在这个空间中进行。如果占比过高,会影响后续的内存分配。

对象晋升后,将会在老生代空间中作为存活周期较长的对象来对待,接受新的回收算法处理。

图书推荐


这本书关于Python/Ruby/Android/JS的垃圾收集器都有讲,前半本书是各类基本算法,原理、优缺点、改进都是循序渐进的给出的,后半本书是实现。

如果还觉得不过瘾,那下面这本应该能满足你。

v8的垃圾回收机制(一)相关推荐

  1. v8的垃圾回收机制(二)

    理解垃圾回收机制有助于理解闭包,内存释放,和内存溢出的知识. 1 Mark-Sweep & Mark-Compact 对于老生代中的对象,由于存活对象占较大比重,再采用Scavenge的方式会 ...

  2. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  3. 浅谈V8引擎中的垃圾回收机制

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  4. 深入理解谷歌最强V8垃圾回收机制

    有很多人都听说过V8引擎,但可能不是很了解,V8名称叫Chrome V8,是由谷歌开源的一个高性能 JavaScript 引擎.该引擎采用 C++ 编写,Google Chrome 浏览器用的就是这个 ...

  5. Node的垃圾回收机制与内存溢出捕获(上)

    Node的垃圾回收机制与内存溢出捕获 一.什么是Node的内存?   想必大家在用JavaScript开发的过程中,不太关心内存的管理,因为对于前端来说,浏览器的内存几乎不会出现用完的情况,因为所接触 ...

  6. nodejs的内存管理,垃圾回收机制

    2019独角兽企业重金招聘Python工程师标准>>> 要点记录: 1.网页js.命令行工具,快进快出的,即时内存泄露,无内存管理必要! 2.服务器端nodejs和其他正规语言一样存 ...

  7. JS引擎V8的内存回收机制与内存限制(标记清除法)

    在Node中通过JavaScript使用内存时会发现只能使用部分呢内存(64位下位1.4GB,32位系统下位0.7GB),这样的限制使得Node无法操作大内存对象.造成这个问题的原因在于Node基于V ...

  8. JavaScript内存分配及垃圾回收机制

    JavaScript内存分配及垃圾回收机制 简介 像C语言这样的高级语言一般都有底层的内存管理接口,比如 malloc()和free().另一方面,JavaScript创建变量(对象,字符串等)时分配 ...

  9. 前端面试查漏补缺--(二) 垃圾回收机制

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

最新文章

  1. 河北高速盘点七大假牌假证违法案例:寒冬穿大裤衩开车
  2. 2020年全球数据中心基础设施收入1650亿美元
  3. hihoCoder #1457 : 后缀自动机四·重复旋律7
  4. yum错误---Running Transaction
  5. 【Matlab/C/Python/VB/...】代码复制到word时如何变成彩色的
  6. 腐蚀国内稳定服务器_工控机箱和服务器机箱区别在哪里
  7. oc c语言,OC之C语言的基础知识
  8. 博科:物理与虚拟网络的统一管理
  9. RQNOJ 342 最不听话的机器人:网格dp
  10. Maya 2018 for Mac中文破解版永久激活方法含注册机
  11. android MediaRecorder录屏时带录音功能实现
  12. 管理学研究中应用计算机仿真,计算机仿真在企业流程再造中应用研究.doc
  13. Color Banding的个人记录
  14. vue--百度地图之离线地图
  15. 全球及中国公共安全记录管理系统行业发展现状及前景趋势预测报告(2022-2027)
  16. java实现zip压缩文件 (一)
  17. Xcode工程文件pbxproj
  18. 在计算机网络中发送电子邮件遵循的协议是,运行在互联网上用于电子邮件发送的协议是...
  19. 编程中的数学理论——排列数组合数
  20. Android下的遥控器DIY

热门文章

  1. Java变量声明在循环体内还是循环体外,你用哪一个?
  2. ​“国产”AI框架争相开源,“领头羊”百度飞桨将扔重磅炸弹?
  3. 5G换机前夕变局:海外停滞,靠中国市场救命?
  4. Docker 开发环境正在崩坏!
  5. .NPT 扩展名格式文件类型及打开方式分析:首次渗入 XR 内容领域
  6. Java 13 新特性全面解读
  7. 用户数据报协议是啥?看完这文就懂了!| 技术头条
  8. 苹果春季发布会:绝不玩别人玩剩下的!
  9. 当开发人员遇上非功能性需求
  10. 什么样的备份容灾系统才真正适合云化数据中心?| 技术头条