深入理解Java虚拟机——G1收集器

x33g5p2x  于2022-02-15 转载在 Java  
字(1.1k)|赞(0)|评价(0)|浏览(217)

一、G1收集器历史

  • G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一,从JDK6u14中开始就有Early Access版本的G1收集器供开发人员实验、试用,由此开始G1收集器的"Experimental"状态持续了数年时间,直至JDK7u4,Sun公司才认为它达到足够成熟的商用程序,移除了"Experimental"的标识。

二、G1手收集器的概述

  • G1是一款面向服务端应用的垃圾收集器。HotSpot开发团队赋予它的使命是未来可以替换掉JDK1.5中发布的CMS收集器。
  • 在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1不再是这样,使用G1收集器时,Java堆的内存布局就与其他收集器有很大差别,它将整个java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,他们都是一部分Region(不需要连续)的集合。
  • 由于目前G1成熟版本的发布时间还很短,G1收集器几乎可以说还没有经过实际应用的考验,网络上关于G1收集器的性能测试也非常广泛,到目前为止,笔者还没有搜索到有关的生产环境下的性能测试报告。

三、G1手收集器的特点

  • 并行与并发
    G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。
  • 分代收集
    与其他收集器一样,分代概念在G1中依然保留。
  • 空间整合
    与CMS的"标记-清理"算法不同,G1从整体上来看是基于"标记-整理"算法实现的收集器,从局部(两个Region之间)上来看是基于"复制"算法实现的。
  • 可预测的停顿
    G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

四、G1手收集器的运行步骤

  • 初始标记(Initial Marking)
    仅仅只是标记一下GC Roots 能直接关联到的对象。
  • 并发标记(Concurrent Marking)
    从GC Root开始对堆中的对象进行可达性分析,找出存活的对象。
  • 最终标记(Final Marking)
    为了修正在并发标记期间因用户程序继续运行而导致标记产生变动的那一部分标记记录。
  • 筛选回收(Live Data Counting and Evacuation)
    首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来指定回收计划。

五、G1手收集器运行示意图

相关文章