`

HotSpot JVM里的G1垃圾收集器

    博客分类:
  • JAVA
 
阅读更多

 

G1垃圾收集器

HotSpot JDK 7从update 4开始引入了G1垃圾收集器。

G1收集器是服务器风格的垃圾回收器,主要针对多处理器机器上占用大量内存的应用。G1能缩短暂停时间,也能提供高吞吐量。

与CMS的区别

和CMS(Concurrent Mark-Sweep)收集器相比,G1具备压缩功能,能避免碎片问题;G1的暂停时间更加可控,用户可以指定暂停时间指标。

以前的垃圾收集器(顺序、并行、CMS)都把堆分为三个部分:年轻代、老年代、永久代,三个部分的大小都是固定的。而在G1里,堆被分为若干区域,每个区域里的内存是连续的。区域会有“角色”,但某个“角色”的大小并不固定,这就提供了更大的内存使用灵活度。

执行垃圾回收的时候,G1的操作和CMS有些类似,G1也会和应用并行地进行全局标记。标记阶段结束后,G1会优先收集存活对象少(占用空间小)的区域,也就是垃圾(可回收对象)多的区域。G1采用“pause prediction模型”,根据用户定义的暂停时间指标确定回收区域的个数。

G1要回收的区域会被清空,里面的存活对象会被拷贝到堆里的另一个单独区域,压缩、释放原区域里的内存。在多处理器机器上,这会并行地执行,减少暂停时间、增加吞吐量。

但G1不是实时收集,它会基于前面收集的相关数据进行评估,看在用户指定的暂停时间里能收集几个区域。

G1里有两个数据结构:

  • Remembered Sets(RSets):每个堆区域都有一个RSet,记录该区域里的对象引用。有了RSet,就可以对区域进行并行、独立的收集。
  • Collection Sets(CSets):GC要收集的区域集合,集合里的区域可以是任意角色(Eden、Survivor或老年代)。CSet里记录的区域都会被清空(回收掉或者移走)。

适用场景

G1适合堆大小差不多是6GB或者更大,暂停时间要求在0.5秒以下的场景。如果应用具备如下一个或多个特征用G1会有比较好的效果:

  • Full-GC执行太频繁,或者持续的时间太长
  • 对象分配的速度差距较大
  • 不希望GC暂停时间超过0.5-1秒

但如果应用或系统的GC暂停时间本来就不长,建议还是保持原先的GC,不要换成G1

工作步骤

堆被划分为很多区域,区域大小由JVM确定(用户也可以设置),通常是1MB-32MB,大约2000个。

区域会具备“Eden”、“Survivor”、“老年代”的角色,但它们不是连续的。还有另外一种区域,叫Humongous区域,它用来存放大对象(大小超过区域大小的50%),这些区域是连续的。

年轻代

存活对象会被拷贝/移动到一个或多个“Survivor”区域,存活时间够长的直接移到“老年代”区域。这里会stop the world,但young GC的过程是多线程执行的。

老年代

1、初始标记(stop the world):标记引用老年代里对象的Survivor区域,这些Survivor区域叫root区域     GC pause (young)(inital-mark)

2、扫描root区域:扫描survivor区域,找到引用老年代里内容的对象。young GC开始前要完成。

3、并发标记:找出整个堆里可达的对象,计算各个区域的对象存活率。这个阶段可能会被年轻代的GC中断。

4、Remark(stop the world):对并发标记阶段的结果查漏补缺,使用snapshot-at-the-beginning(SATB)算法,比CMS使用的算法快很多;而且会回收空区域(没有存活对象的区域)

5、清理:先stop the world,收集对象存活率最低的区域,然后清理Remembered Set。接着应用可以运行了,这时会重置空闲区域,并将这些区域返回给free list。年轻代和老年代同时回收

6、拷贝(stop the world):将存活对象拷贝到没有使用的区域里

命令行选项

G1可用的命令行选项有:

-XX:+UseG1GC——让JVM使用G1垃圾回收

-XX:MaxGCPauseMillis=200——设置GC暂停时间目标值,缺省200毫秒。但这不是硬指标,JVM会尽力满足。

-XX:InitiatingHeapOccupancyPercent=45——整个堆被占用多少之后开始进行GC,缺省为45,0表示持续不停进行GC

-XX:NewRatio=n——年轻代和老年代的比例,缺省为2

-XX:SurvivorRatio=n——Eden和Survivro的比例,缺省为8

-XX:G1ReservePercent=n——保留的堆大小,减少晋升过程中出错的可能性,也就是增加可用的to-space内存,缺省是10

-XX:G1HeapRegionSize=n——G1中,堆分为大小相等的区域。这个参数设置区域的大小,缺省值取决于堆的总大小,有效取值是1M-32M。

最佳实践

使用G1时的最佳实践

1、不要设置年轻代的大小(-Xmn),否则会扰乱G1的缺省行为,JVM也不会满足用户指定的暂停时间。而且设置了固定值的话,G1将无法随需扩展年轻代的大小

2、GC暂停时间不是100%能保证的

3、如果GC的晋升过程中遇到堆区域溢出(使用-XX:+PrintGCDetails看到to-space overflow),可以通过下面几种方式避免:

  • 增加-XX:G1ReservePercent=n,缺省值是10。这可以增加可用的to-space内存
  • 使用-XX:ConcGCThreads=n增加标记线程数目
分享到:
评论

相关推荐

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器

    ### 性能工程师指南:玩转OpenJDK HotSpot垃圾收集器 #### 一、性能工程概述 在软件开发过程中,性能工程是一个重要的环节,它不仅涵盖了对软件性能的需求定义与测试计划制定,还包括了软件的开发、实施及后续的...

    JVM Hotspot实现源码

    2. **垃圾收集器模块**:Hotspot提供了多种垃圾收集器,如Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage-First)。每种收集器都有其特定的适用场景和优化策略,例如,G1采用并发标记和空间整理,以...

    HotSpot GC官网文档截图 - 20200917

    - G1收集器是现代Java应用的首选,它引入了区域(Region)的概念,可以预测并控制垃圾收集的暂停时间。G1能自动平衡堆空间,同时进行并发标记和局部回收,以达到低延迟的目标。G1的调优涉及到一系列参数,如`-XX:...

    JVM性能调优垃圾收集算法虚拟机组成.zip

    在实际应用中,JVM提供了多种GC策略,如串行GC、并行GC、并发标记清除(CMS)和G1垃圾收集器等。选择合适的GC策略,结合调整新生代和老年代的大小、暂停时间目标(Pause Time Goal)、吞吐量目标等参数,是进行JVM...

    hotspot.tar.gz

    例如,G1收集器采用了区域化内存布局和并发标记清除,旨在减少停顿时间,适合大规模分布式系统。 三、动态编译与优化 Hotspot VM的动态编译是其性能优化的关键。它能够监测代码执行情况,根据热点探测机制决定何时...

    【译】Java 14 Hotspot 虚拟机垃圾回收调优指南(csdn)————程序.pdf

    3. **G1收集器(Garbage-First Garbage Collector)**:目标是可预测的暂停时间,适合大型应用,可以通过 `-XX:+UseG1GC` 开启。 4. **Z收集器(Z Garbage Collector)**:也称为ZGC,设计目标是极低的暂停时间,...

    JVM虚拟机源码(C++)

    2. **垃圾收集器**:HotSpot支持多种垃圾回收算法,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和 Garbage First (G1)。这些算法各有优缺点,适应不同的应用场景。 3. **运行时系统**:包括对象模型、内存...

    Lesson1.pdf

    垃圾收集器是HotSpot JVM内存管理子系统的关键组成部分。它负责跟踪和管理内存的分配与释放,确保及时回收不再使用的对象所占据的内存空间。垃圾收集器工作的时候,会遍历程序中的对象引用,并确定哪些对象是存活的...

    JVM垃圾回收及监控优化1

    G1收集器则是新一代的垃圾收集器,目标是实现可预测的暂停时间模型,通过分区技术来优化内存回收。 CMS收集器的工作流程包括初始标记、并发标记、最终标记和并发清除四个阶段,其中并发标记和并发清除阶段与应用...

    jvm调优.zip & hotspot源码解读

    而G1和ZGC是现代JVM中的先进收集器,它们实现了并行和并发收集,降低了停顿时间。 5. JVM调优工具详解: 工具如JVisualVM、JConsole、JProfiler等提供了丰富的监控和分析功能,帮助我们了解JVM运行状态,定位性能...

    HotSpot实战高清版本

    Cache、Perf Data、Crash 分析方法、转储分析方法、 垃圾收集器的设计演进、CMS 和 G1 收集器、栈、JVM 对硬件寄存器的利用、栈顶缓存技术、解释器、字节 码表、转发表、Stubs、Code Cache、Code 生成器、JIT 编译器...

    JVM总结.docx

    HotSpot JVM是Oracle提供的JVM实现,其中包含多种垃圾收集器,针对不同的性能需求和场景提供了多样化的选择。 1. Serial收集器:这是最基本的单线程垃圾收集器,适用于小型应用或对响应时间要求不高的环境。新生代...

    JVM历史发展和内存回收笔记

    6. **Java 7与G1 GC**:2011年,Java 7引入了G1(Garbage First)垃圾回收器,它是一种并行、并发且具有低延迟特性的垃圾回收器,适用于大型应用。 7. **Java 8与元空间**:2014年,Java 8中,永久代被元空间...

    jdk20-hotspot-virtual-machine-garbage-collection-tuni

    4. **垃圾收集器类型**:HotSpot提供了多种GC策略,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)、G1(Garbage-First)和ZGC(Zing Concurrent Low Latency Collector)。每种收集器有...

    hotspot源代码

    5. **垃圾收集器**:Hotspot的垃圾收集器源代码展示了各种GC算法的实现,如CMS的并发标记清除过程,G1的 Region 分区和并行回收,以及ZGC的低暂停时间设计。 三、源代码学习的价值 1. **性能优化**:通过深入源...

    hotspot-virtual-machine-garbage-collection-tuning-guide.pdf

    4. **G1垃圾收集器(G1 Garbage Collector)**:G1是一种新生代和老年代都进行并发收集的垃圾收集器,目标是实现可预测的暂停时间模型。G1会将堆划分为多个区域,并尝试预测和控制每次GC的暂停时间。 在选择垃圾...

    2_JVM_3章下~5.pdf

    G1收集器是一款全功能垃圾回收器,它将整个堆内存划分为多个大小相等的独立区域(Region),并根据需要将某些Region用作新生代Eden、Survivor或老年代空间。G1收集器支持面向局部回收的设计思路,能够根据停顿时间...

    jvm 调优建议文档

    - **垃圾收集器介绍**:JVM提供了多种垃圾收集器,包括Serial Collector、Parallel Collector、CMS Collector以及G1 Collector等,每种收集器都有其适用场景和特点。 - **G1垃圾收集器详解**:G1(Garbage First)是一...

Global site tag (gtag.js) - Google Analytics