之前我分享了一个动画视频《动画演示 JVM G1 垃圾回收算法的内存布局和年轻代的垃圾回收过程》。本文简要列举一下G1算法的特点。

策略上的改进

  • G1 是采用增量的方式回收垃圾。为了控制停顿时间,一次收集一部分。
  • G1 的停顿时间更加可预测。它会尽量(90%)地保证停顿时间

G1 GC is an incremental parallel compacting GC that provides more predictable pause times compared to CMS GC and Parallel Old GC.

G1 的堆heap不再采用老式的分代分区方式,而是引入了一个新的布局方式,2048个大小相等region。region的大小在1M到32M之间。G1 维护了一个空闲的region列表。根据需要可以从列表里分配一个作为年轻代或老年代。G1 的策略是在保证停顿时间<200毫秒的情况下,尽可能回收那些存活对象少,垃圾对象多的region。这样的回收效率会很高。也是Garbage First的名字由来。

年轻代

G1 的年轻代的GC还是采用原来的标记,复制和清除算法,只不过是发生在region上。G1 根据XX:MaxGCPauseMillis的设置,自动调整年轻代的region的个数。G1 的新对象还是会在eden region分配。同时为大对象(大小超过region一半)设计了一类专门的Humongous region。

并发标记

当heap用量大于–XX:InitiatingHeapOccupancyPercent,默认45%的时候,就会触发一次并发标记(a multi-phased concurrent marking cycle)。采用了更加先进的标记算法:Snapshot-At-The-Beginning (SATB)。

  1. The Initial Mark Phase - 初始标记。这几乎就是一次年轻代的GC。会停顿(stop the world)
  2. The Root Region Scanning Phase - 根region的扫描。经过初始标记之后,存活对象都复制到了一个存活 survivor region。这个阶段就是以这些存活对象为根,寻找老年代的存活对象。注意:这个过程不用停顿用户程序(也就是说eden区可以继续分配对象),但是一定不能发生新一轮的年轻代的gc。(否则这个survivor region就被修改了)。
  3. The Concurrent Marking Phase - 并发标记。gc会全heap寻找存活对象。注意,这个过程不用停顿用户程序,但是可以被年轻代的gc打断。
  4. The Remark Phase - 再标记。这是为了结束整个标记过程。会停顿(stop the world)。
  5. The Cleanup Phase - 清算。 这是并发标记的最后一步。计算每个region的存活指数(live-ness)。在计算的时候会停顿(stop the world)。

混合垃圾回收 mixed collection

年轻代的gc只会回收年轻代的region。而mixed collection会同时回收年轻代和老年代的region。

经过并发标记之后,gc就有了mixed collection所需要的必要信息:该不该回收,该回收哪些region。

整个过程和年轻代的gc差不多。也是复制,清除。对于年轻代的,复制到survivor region或者提升到old region。对于年老代的region的对象,复制到年老代的region。

mixed collection不是一次性的,通常会发生好几轮(因为需要控制停顿时间,不能一次收集太多old region)。直到收集到足够多的年老代的region,也就是heap的用量低于45%。之后就会回到年轻代的gc。等到heap用量大于45%之后就会进入新的并发标记,然后多轮mixed collection。

参考

  • Getting Started with the G1 Garbage Collector 【https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html】
  • G1: One Garbage Collector To Rule Them All 【https://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All/】

垃圾回收算法_划重点 JVM G1 垃圾回收算法相关推荐

  1. jvm垃圾回收机制_深入理解JVM的垃圾回收机制

    ​如何判断对象已"死" Java堆中存放着几乎所有的对象实例,垃圾回收器在堆进行垃圾回收前,首先要判断这些对象那些还存活,那些已经"死去".判断对象是否已&qu ...

  2. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  3. java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

  4. 各类型土地利用图例_划重点!国土空间总体规划——土地利用

    四.土地利用 (一) ​土地利用是否协调匹配 国土空间规划的要素和资源,最终都要落到土地上,土地利用自然成为国土空间规划需要研究的关键问题.所谓土地利用,是指人类通过特定的行为,以土地作为劳动对象或手 ...

  5. recycleview 自动循环滚动_划重点 | 不能不知的滚动轴承知识—轴承分类(续)

    直线运动滚动支承的分类 01直线运动滚动支承基本概况概况 直线运动滚动支承是在相对运动的零件之间加入滚动原件组成的运动副,运动零件之间主要是滚动摩擦,因此具有摩擦因数小,启动方便.动作灵活.使用寿命长 ...

  6. xamarin textview 滚动_划重点 | 不能不知的滚动轴承知识—轴承分类

    滚动轴承的分类方法 滚动轴承结构型式繁多,分类的方法也很多.我国滚动轴承的分类方法是按轴承的结构类型和尺寸大小进行分类.结构类型分类是按轴承所承受载荷作用的方向.滚动体的形状.每套轴承中滚动体列数和工 ...

  7. etc的常见算法_谈常用的几个机器学习算法,学懂算法也可以这么简单!

    本文的目的,是务实.简洁地盘点一番当前机器学习算法.文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的经验,将对此类模型优缺点及选择详加讨论 主要回顾 ...

  8. 病虫害模型算法_基于深度学习的目标检测算法综述

    sigai 基于深度学习的目标检测算法综述 导言 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一.由于各类物体有不同的外观,形状,姿态,加上成像 ...

  9. hash算法_到底什么是Hash?Hash算法的原理和实际应用讲解

    提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解. 1.什么是Has ...

  10. 蝴蝶优化算法_腾讯机智团队分享--AllReduce算法的前世今生

    从事分布式深度学习相关工作的同学,应该都频繁地用到了AllReduce(规约)操作. 图1 AllReduce的示意图 但是对于训练框架中集成的AllReduce相关操作,其背后实现的原理是什么? 除 ...

最新文章

  1. 写 5 个你知道的 HTML5 标签,说明他们的意义
  2. Unity3D小功能 小技巧 小教程 小原理(持续更新...)
  3. 皮一皮:网络延迟的好处...
  4. (三)ajax请求不同源之websocket跨域
  5. 下一代Hotmail和MSN Messenger最新界面截图
  6. 关于Integer.MAX_VALUE + 1 = Integer.MIN_VALUE 问题
  7. RTMP直播应用与延时分析
  8. win7下的nginx小demo
  9. [Ext JS 4] 实战之Chart, Column Chart 定制颜色
  10. 马云经典语录:我不是传奇 我是平凡的人
  11. 算法笔记_面试题_15.回溯算法模板及示例
  12. CAB无法连接到远程计算机,当您使用远程桌面连接 (RDC) 7.0 连接不正确地更新远程应用程序应用程序中的组合框项...
  13. 《曹全碑》临习方法与释文翻译
  14. NFT Insider #38:YGG旗下YGG SEA融资1500万美元,耐克收购虚拟时尚品牌RTFKT
  15. 和娃一起过暑假:一次4000+km自驾的尝试
  16. Rockchip DRM RK628 Porting Guide
  17. 论文引用参考文献和自动更新的方法
  18. 在手机屏幕上移动APP的两种方式
  19. 分布式计算——Daytime协议的实现(TCP版)
  20. vue created钩子使用后台数据赋值给data里的变量,报错‘undefined’

热门文章

  1. Windows Server 2008官方(MSDN)简体中文正式版试用心得
  2. 迷你博客突然走红 至今尚无商业模式
  3. Java String 类型对象不能改变
  4. f2fs系列之五:冷热数据分离
  5. Oracle 创建表空间借鉴 保留,占版权留言告知
  6. 鹰眼跟踪、限流降级,EDAS的微服务解决之道
  7. maven gradle等三放jar包仓库
  8. ping and traceroute(tracert)
  9. 第三方接口,消息保障性发送机制
  10. hdu1274 展开字符串