理解垃圾回收机制有助于理解闭包,内存释放,和内存溢出的知识。

1

Mark-Sweep & Mark-Compact

对于老生代中的对象,由于存活对象占较大比重,再采用Scavenge的方式会有两个问题:一个是存活对象较多,复制存活对象的效率将会很低;另一个问题依然是浪费一半空间的问题。这两个问题导致应对生命周期较长的对象时Scavenge会显得捉襟见肘。为此,V8在老生代中主要采用了Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收。

Mark-Sweep是标记清除的意思,它分为标记和清除两个阶段。与Scavenge相比,Mark-Sweep并不将内存空间划分为两半,所以不存在浪费一半空间的行为。与Scavenge复制活着的对象不同,Mark-Sweep在标记阶段遍历堆中的所有对象,并标记活着的对象,在随后的清除阶段中,只清除没有被标记的对象。可以看出,Scavenge中只复制活着的对象,而Mark-Sweep只清理死亡对象。活对象在新生代中只占较小部分,死对象在老生代中只占较小部分,这是两种回收方式能高效处理的原因。

Mark-Sweep最大的问题是在进行一次标记清除回收后,内存空间会出现不连续的状态。这种内存碎片会对后续的内存分配造成问题,因为很可能出现需要分配一个大对象的情况,这时所有的碎片空间都无法完成此次分配,就会提前触发垃圾回收,而这次回收是不必要的。

为了解决Mark-Sweep的内存碎片问题,Mark-Compact被提出来。Mark-Compact是标记整理的意思,是在Mark-Sweep的基础上演变而来的。它们的差别在于对象在标记为死亡后,在整理的过程中,将活着的对象往一端移动,移动完成后,直接清理掉边界外的内存。

完成移动后,就可以直接清除最右边的存活对象后面的内存区域完成回收。

这里将Mark-Sweep和Mark-Compact结合着介绍不仅仅是因为两种策略是递进关系,在V8的回收策略中两者是结合使用的。

在Mark-Sweep和Mark-Compact之间,由于Mark-Compact需要移动对象,所以它的执行速度不可能很快,所以在取舍上,V8主要使用Mark-Sweep,在空间不足以对从新生代中晋升过来的对象进行分配时才使用Mark-Compact。

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

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

    理解垃圾回收机制首先要理解垃圾回收使用的算法. 1 V8主要的垃圾回收算法 垃圾回收策略主要基于分代式垃圾回收机制.垃圾回收算法中按对象的存活时间将内存的垃圾回收进行不同的分代,然后分别对不同分代的内 ...

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

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

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

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

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

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

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

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

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

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

  7. JS引擎中垃圾回收机制

    思考: 1.JavaScript的内存是如何管理的? 2.Chrom浏览器是如何进行垃圾回收的? 我们带着以上两个思考来阅读文章. 一.JS内存管理 MDN介绍:"JavaScript 是在 ...

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

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

  9. 垃圾回收机制和菜单栏工具栏

    垃圾回收机制和菜单栏工具栏 文章目录 垃圾回收机制和菜单栏工具栏 一.垃圾回收机制 二.菜单栏工具栏 一.垃圾回收机制 QPushButton* b1 = new QPushButton(this); ...

最新文章

  1. Golang-简洁的并发
  2. GARFIELD@02-25-2005
  3. 直播回顾丨神策数据王朋:如何搭建一套高可用的前端异常监控系统?
  4. 【数据库系统概论】考研第一部分重点分析【1.1】
  5. java容器遍历_高效遍历Java容器详解
  6. 灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断
  7. Hyper-V 2016 系列教程45 System Center 2016 Data Protection Manager 可以备份什么
  8. android 控件突然变小,android中自定义控件
  9. java produces_java-在所有产生JSON的端点上使用@Produces(“...
  10. 控制台应用程序中Main函数的args参数
  11. Nginx 多重判断
  12. html中居中方法,HTML中5种常见的居中方法
  13. linux根据关键字查询日志的方法
  14. 鸡啄米:C++编程入门系列之前言
  15. 【剑指 Offe】剑指 Offer 17. 打印从1到最大的n位数
  16. 为什么那些美事没有实现---生活中小事有感
  17. c语言程序设计年份,C语言程序设计 输出任意年份的日历
  18. 编程啦1001_超级最小公倍数
  19. scrapy开始初始下载
  20. cv2.warpAffine( )

热门文章

  1. 历时3个月,我们是如何为一个开源项目集资300万美元的?
  2. TIOBE 6 月编程语言排行榜:C 与 Java 进一步拉开差距、Rust 跃进 TOP 20
  3. 哟,2020 年了,用 Vue 做一个自己的小程序吧!| 原力计划
  4. 学习 Python,这 22 个包怎能不掌握?
  5. TIOBE 3 月编程语言排行榜:Java 大涨,Delphi 辉煌不再!
  6. 2020 年告别办公室!
  7. 只需三种手段,将传统的网站的性能提高 24%!
  8. Python 绘图,我只用 Matplotlib
  9. “近一个月”、“近三个月”这种查询如何处理更精确?
  10. 看完就能用!这本Python3.6 的书玩大了!网友:牛!