[JVM 相关] Java 新型垃圾回收器(Garbage First,G1)

回顾传统垃圾回收器

  • HotSpot 垃圾收集器实现

    • Serial Collector(串型收集器)

      使用场景,大多数服务器是单核CPU。

      适用收集场景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)

  • Parallel Conllector(并行收集器)

    又叫吞吐量收集器(throughput collector)应用于多核系统。

    适用收集场景:1. 新生代收集是并行处理。2. 老年代收集和Serial Collector一样。

  • Parallel Compacting Collector(并行压缩收集器)

    The parallel compacting collector was introduced in J2SE 5.0 update 6. The difference between it and the parallel collector is that it uses a new algorithm for old generation garbage collection.

    Note : Eventually, the parallel compacting collector will replace the parallel collector.

    上述文字中斜体文字告诉我们,这个收集器和上一个并行收集器唯一的不同是在老年代使用了新的算法。

    适用收集场景:1. 新生代收集(Young Generation Collector) 和Parallel Collector 相同;2. 老年代收集(Old Generation Collector)

  • Concurrent Mark-Sweep (CMS) Collector (并发标记清除)

    Young generation collections 通常不会造成长时间停顿,然而old generation collections却是是造成长时间停顿的,虽然它不长出现,特别是在大的heaps回收被涉及到的时候。为了处理这个问题,HotSpot JVM 引入了一个叫做 concurrent mark-sweep(CMS) collector,通常也被称为低延时收集器low-latency collector.

    适用场景: 仅适用于老年代,新生代处理方式和Parallel Collector相同。

G1目标

G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector. 计划将G1作为CMS收集器的长久替代物。

它是为了平衡 延时和吞吐量之间的一种最优关系。

G1实现原理

基本属性
和CMS的相同点
  • CMS Replacement(CMS替代物)
  • Server 'Style' Garbage Collector(服务端垃圾收集器-内存,核数区别)
  • Parallel 并行
  • Concurrent 并发
  • Generational 分代
和CMS的主要区别
  • Good Throughput 良好的吞吐量
  • Compacting 压缩
  • Improved ease-of-use 提升了易用性(更多的JVM参数可用)
  • Predictable(though not hard real-time) 可预估的,非绝对实时。
基本概念
  • G1 堆布局

G1将堆分成若干固定大小的Region/区域(区域大小只有1、2、4、8、16和32M),G1的新生代和老年代都是一个无需连续的区域集合,每一个区域独立进行内存的分配和回收,区域是内存管理的基本单元,在某一个时间节点,可能是空闲的,当内存被请求时,内存管理器将空闲的Region分配到某个分代,然后归还应用分配给的空间。

大多数情况下,GC的操作同一时间只会在一个区域进行。

  • Region 分布

    超大对象(Humongous Objects)

    下图中跨区域的灰色模块即代表了超大对象,超大对象是指那些空间大小 >=1/2 个区域空间的对象.超大对象有时候会被以下特殊方式处理:

    • 每个超大对象在老年代区域中的连续区域分配。对象分配起始于在连续区域中的首个成员,如果连续区域中的最后一个区域存在剩余空间的话,那么该空间将失去分配的机会,直到其关联的超大对象被完全回收
    • 超大对象的回收通常仅在Cleanup停顿中的Marking结束后、或者在Full GC时。
    • 超大对象的分配可能造成垃圾收集停顿过早地发生(主要是因为空间浪费。)
    • 超大对象绝不会发生移动,即使在没有Full GC的情况下
  • 回收周期

    • Young-only

      Young-only 阶段的垃圾 收集 时逐渐地将老年代的对象填充到当前可用的内存。即将可以提升的新生代对象提升到老年代。

      该阶段开始于Young-only的 收集 动作,也就是下图中的蓝色小球,每一个小球都是一次收集动作,也就是提升对象到老年代。Young-only 与Space-reclamation 过渡实际上是开始于老年代空间 *占用* 达到某个阈值,即Heap初始化占用阈值。此时,G1将调度Initial Mark的Young-only收集(蓝色大球),而非常规的Young-only(蓝色小球)收集。

      • Initial Mark

      此类收集开始于标记过程,附带一个常规的Young-only收集,并发标记决定所有在老年代区域中可达的存活对象是否要遗留到Space-reclamation 阶段。当标记过程未结束时,常规的Young-only 收集可能已经发生,等到标记完成时,将伴随着两个特殊的Stop-The-World停顿,RemarkCleanUp.

      • Remark 停顿

        因为在Initial Mark标记过程中,因为它是并发执行,有可能会发生Young-only收集,造成标记数据有误差,因此需要重新标记一次,该过程为串行执行,会造成Stop-The-World.

        在Remark 和Cleanup之间,G1将并发地计算出一份对象存活性总结报告,它将在Cleanup停顿阶段更新内部的数据结构

      • Cleanup 停顿

        该停顿同样将完整的回收空闲区域,并且决定Space-reclamation阶段是否需要继续跟踪,如果继续跟随的话,Young-only阶段的完成仅仅做Young-only收集动作。

    • Space-reclamation

      Space-reclamation(空间回收/复用)阶段是回收老年代空间,同时处理新生代。

      这个阶段由多个混合的收集动作组成,不仅包含新生代区域,同时也会排除老年代区域的存活对象,当G1发觉依然无法满足空闲的空间请求时,G1会终止本阶段。如果应用消耗完内存,G1将执行Stop-The-World的全堆压缩(Full GC)。

    如下图所示:

    <img src ="https://i.loli.net/2019/08/05/ZMTmN25FohfBkJw.png" width="400" >

    2种过程是循环往复收集。

G1指令细节

初始空间占用

Initiating Heap Occupancy Percent(IHOP): Initial Mark 收集触发的阈值,为老年代空间定义Heap占用的百分比。

JVM 设置参数:-XX:InitiatingHeapOccupancyPercent

默认情况下,根据标记时间以及老年代在标记周期中的内存分配,G1垃圾收集器将自动抉择理想的IHOP的值。

JVM 失效参数:-XX:-G1UseAdaptiveIHOP

修改区域空间大小

-XX:G1HeapRegionSize

G1 Vs. 传统垃圾回收器

  • G1 不区分新/老生代,只区分Region

  • G1 收集分2个阶段Young-onlySpace-reclamation

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容