深入浅出JVM(十八)之并发垃圾收集器G1

在这篇文章 深入浅出JVM(十六)之三色标记法与并发可达性分析 中,我们曾说明过GC线程和用户线程并发执行导致的对象消失问题,可以使用增量更新或原始快照的方式来解决

上文深入浅出JVM(十七)之并发垃圾收集器CMS中描述过使用增量更新的CMS,本文将介绍使用原始快照的G1垃圾收集器

Garbage First

G1 全称 Garbage First 面向服务端的垃圾收集器,G1诞生是为了在延迟可控的情况下尽可能高的吞吐量

Region

G1 不再使用分代收集算法,把Java堆内存分为多个大小相等的区域(Region),面向堆内存任何部分来组成区(Region)进行收集,哪块内存垃圾最多,收益最大就回收哪块

image.png

Region分为新生代Eden、新生代Survive、大对象Humongous

大多数情况下Humongous被当成老年代

当大对象太大,一个Humongous不够时,使用连续多个Humongous存储

每个区域设计2个TAMS(Top at Mark Start)指针,把区域中一部分空间划分出来用来为新对象分配内存(指针碰撞,内存规整)

G1从整体上可以看成使用标记-整理算法,从局部上可以看成使用区域间复制算法

执行过程与流程图

G1采用原始快照来解决GC线程与用户线程并发时的对象消失问题

G1收集器在后台维护一个优先级队列跟踪各个区域中的垃圾回收价值(回收垃圾的大小和回收时间的情况)

根据-XX:MaxGCPauseMillis用户规定的收集停顿时间来优先回收垃圾回收价值最大的区域

执行过程

  1. 初始标记 : 标记GC Roots能直接关联的对象,修改TAMS指针(停顿用户线程,耗时短)
  2. 并发标记 : 从GC Roots直接关联对象开始遍历整个引用链的过程(GC线程与用户线程并发执行耗时长),扫描完还要处理原始快照记录在并发时有引用变动的对象
  3. 最终标记 : 处理并发阶段遗留下来的少量原始快照记录(停顿用户线程,耗时短)
  4. 筛选回收 : 更新区域的垃圾回收价值,把各个区域的垃圾回收价值(要算成本:回收时间)在优先级队列中排序,根据用户所期望的停顿时间制定回收计划,把要回收的那片区域存活的对象复制到空区域中(复制对象要暂停用户线程,GC线程并行执行)

如果期望停顿时间设置太短(不符合实际),由于停顿时间短,回收垃圾速度<为新对象分配内存速度,会导致堆满Full GC反而会降低性能

image.png

参数

-XX:+UseG1GC 使用G1收集器

-XX:G1HeapRegionSize设置每个region大小

-XX:MaxGCPauseMillis设置预期停顿时间 (默认200ms,最好不要太小)

-XX:ParallelGCThread设置GC线程数

-XX:ConcGCThreads设置并发标记线程数

-XX:InitiatingHeapOccupancyPercent设置触发老年代GC的堆占用率阈值

特点

优点

  1. 整体:标记-整理、局部:复制,不会产生内存碎片
  2. 从用户期望时间来回收垃圾价值最高的垃圾
  3. 原始快照的好处(记录旧引用,不需要添加新引用记录,减少并发标记、重新标记阶段的消耗)

缺点

  1. 因为有很多区域,跨区域引用对象问题频繁出现,每个区域要维护记忆集(Key:别的区域地址 Value:集合存储卡表的索引号),卡表实现复杂(其他卡表:我指向谁,这里的卡表:我指向谁+谁指向我),所以占用内存更大

  2. 执行负载大(写屏障操作复杂)

    写后屏障维护复杂的卡表

    原始快照的坏处(需要记录旧引用):写前屏障跟踪并发指针变化,在用户程序运行中产生有跟踪引用变化带来的额外负担

    CMS写屏障可以直接同步,而G1写屏障太复杂要把写前屏障和写后屏障中做的事放到队列中,异步处理

总结

本篇文章深入浅出的介绍G1并发垃圾收集器Region、执行过程、流程图、参数、特点等知识

G1不使用分代算法,将内存分为Region,Region分为Eden、Survive、Humongous,从局部可以看成复制算法,整理上看成标记-整理算法

G1初始标记枚举GC根节点,在并发标记中使用原始快照解决对象消失问题,最终标记后使用优先级队列优先回收价值高的region

G1不会产生内存碎片,能够在期望的低延迟中完成价值最大的清理,但维护跨代引用、写后屏障等开销大

内存较大、处理器较多、期望低延迟、面向服务端的垃圾收集器可以选择G1

最后(一键三连求求拉~)

本篇文章将被收入JVM专栏,觉得不错感兴趣的同学可以收藏专栏哟~

本篇文章笔记以及案例被收入 gitee-StudyJavagithub-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JVM是一种虚拟机(Java Virtual Machine),能够在不同操作系统和硬件平台上运行Java程序。而G1垃圾收集JVM中的一种垃圾收集算法,可以处理大型Java堆。 使用G1垃圾收集能够提高应用程序性能,因为它采用分区技术和优先级调度算法,可以根据应用程序的使用情况,动态地分配堆空间分区,从而减少垃圾收集时间和暂停时间。 下面是使用G1垃圾收集来优化JVM的步骤: 第一步,设置JVM参数,例如开启G1垃圾收集,设置堆空间大小等。 第二步,使用JVisualVM或其他工具,对应用程序进行分析,确定是否存在内存泄漏或内存过度消耗的现象。如果有问题,则需要对应用程序进行修改,以降低内存使用率。 第三步,对应用程序进行压测,确定最大并发并适当调整G1垃圾收集参数,例如设置初始停顿时间、最大停顿时间、空闲时间等。 但需要注意的是,使用G1垃圾收集时需要事先评估应用程序的运行环境和特性,例如硬件配置、每秒请求计数、响应时间等。只有在合适的环境下,G1垃圾收集才能发挥最佳效果。同时,应用程序也需要符合一些条件,例如堆空间不能太小,内存消耗不能太大等。 总之,通过优化JVM,使用G1垃圾收集能够提高Java应用程序的性能和可靠性,减少停顿时间。但使用时需要仔细评估和测试,确保最佳效果。 ### 回答2: JVM是Java虚拟机的缩写,是Java运行环境的核心部分。垃圾收集JVM的一个重要组成部分,负责回收程序的无用对象和内存。G1垃圾收集JVM中的一种,是目前比较流行的一种。下面介绍G1垃圾收集的优化使用方法。 首先,G1垃圾收集最大的优点是能够充分利用多核处理和大内存的优势。因此,在使用G1垃圾收集时,需要配置合适的垃圾回收线程数和堆内存大小。通常情况下,推荐将垃圾回收线程数设置为CPU核心数的一半左右,而堆内存大小则应根据应用程序的实际情况设定。 其次,G1垃圾收集还支持增量垃圾回收和并发标记。这意味着垃圾收集可以在应用程序执行的同时,进行部分的垃圾回收和标记操作。这有利于减少垃圾回收对应用程序执行的影响。 再次,G1垃圾收集还支持混合模式。这种模式下,垃圾收集会将堆内存分为多个区域,并按照各个区域的使用情况决定垃圾回收的策略。一些非常重要的区域可以在短时间内进行Full GC,而其它区域则可以使用增量式垃圾回收策略。这一功能可以进一步提高垃圾回收的效率。 最后,在使用G1垃圾收集时,还需要注意一些细节问题。例如,需要选择合适的回收阈值、合理配置回收周期等等。此外,一些调试工具如JConsole、JVisualVM等也可以帮助开发者监控和调整G1垃圾收集的性能。 总之,G1垃圾收集是目前JVM中性能较优异的垃圾收集之一。在使用G1垃圾收集时,需要根据实际情况合理配置线程数、堆内存大小和一些参数,同时关注混合模式、增量垃圾回收和并发标记等特点,才能充分发挥其性能优势。 ### 回答3: JVM是Java虚拟机的缩写,它是Java程序运行的环境,它提供了一个平台无关的执行环境,能够提高Java应用程序的效率和安全性。Java应用程序的性能优化是一个复杂的过程,其中之一的重要方面是垃圾收集的优化。 G1是JVM中的一种垃圾收集,它主要用于大堆内存应用程序,它在处理垃圾回收时可以实现高吞吐量和低延迟,而且它可以管理大容量的内存,能够处理高并发情况下的大量垃圾回收。 G1垃圾收集具有以下优点: 1.低延迟:G1垃圾收集能够有效地降低应用程序的延迟,因为它是一个分区式的垃圾收集,它会将内存分成多个区域,每个区域都有自己的垃圾回收时间,这样可以最大程度的减少垃圾回收的时间。 2.高吞吐量:G1垃圾收集能够管理大容量的内存,能够处理大量的垃圾回收,因此它的吞吐量很高。 3.可预测性:G1垃圾收集能够实现可预测性垃圾回收,这意味着它可以为每个应用程序分配一个确定的垃圾回收时间,从而避免出现系统性能波动的情况。 4.自适应:G1垃圾收集能够根据内存的使用情况来自动调整垃圾回收的策略,从而最大程度地优化垃圾回收的效率和性能。 在使用G1垃圾收集时,需要注意以下几点: 1.适当配置参数:需要根据应用程序的实际情况,适当配置G1的参数,以提高垃圾回收的效率和性能。 2.避免频繁Full GC:G1垃圾收集能够尽量避免Full GC,但是在一些场景下,还是会出现Full GC的情况,因此需要尽量避免频繁Full GC的情况出现。 3.避免内存泄漏:G1垃圾收集虽然能够处理大量垃圾,但是它无法处理内存泄漏的情况,因此需要及时发现和解决内存泄漏的问题。 总之,G1垃圾收集是一个高性能、高效率的垃圾回收,能够满足大堆内存应用程序的垃圾回收需求。在使用过程中,需要根据实际情况适当配置参数,避免频繁Full GC和内存泄漏的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值