JVM(Java Virtual Machine)G1收集器篇

前言

本文参考《深入理解Java虚拟机》,本文主要介绍G1收集器的收集思想和具体过程(填上一篇文章留下的坑)

本系列其他文章链接:
JVM(Java Virtual Machine)内存模型篇
JVM(Java Virtual Machine)垃圾收集算法篇
JVM(Java Virtual Machine)垃圾收集器篇

G1(Garbage First)收集器

G1是一款主要面向服务端应用的垃圾收集器。它诞生的目的就是取代CMS的位置,或者说是“代替者”和“继承人”。开发者在设计之初,就是希望能建立一个“停顿时间模型”的收集器。

停顿时间模型:能够支持指定在一个长度为x毫秒的时间片段内,消耗的垃圾收集时间大概率不超过x毫秒这样的目标

所以G1就在这样的希望下,被创造出来了

G1的“化整为零”

在G1收集器中,它将连续的堆划分为大小相等的独立的区域(Region),每个Region都可以根据需要,扮演新生代的Eden、Survivor空间或者老年代空间,这些空间大小都是动态变化的,不再和以前的收集器一样限定分区空间大小。

除此之外,Region还有一类Humongous区域,这部分区域是专门为大对象准备的。

大对象判定:每个对象超过Region容量一半以上就算大对象

所以基于以上分区下,G1的垃圾收集就没有Minor GC、Major GC、Full GC 这种概念了,它采用的是Mixed GC,也就是说,G1可以对堆中的任何部分来组成回收集合(Collection Set),通俗就是“打包一起丢”,它的衡量标准是:哪块内存中存放的垃圾数量最多,回收价值越大,就在规定的时间内优先处理这些垃圾

因此为了知道那个区域最优价值,所以也需要维护一个优先列表,每次GC,从列表中取最优的,这也是为什么叫“Garbage First”的原因。

基于以上,G1中,堆的内存布局可能是这样的:
在这里插入图片描述

G1存在的关键问题已经如何解决的

  • :Region里面存在跨Region引用对象如何解决?

答:
使用记忆集,但这个记忆集会比其他垃圾器的记忆集更为复杂,G1 至少要花费相当于Java堆容量的10%~20%来对这个记忆集进行维护工作。 每个Region的记忆集不就记录下当前Region指向的其他Region的地址,而且还有别人指向自己的并标记这些指针分别在哪些卡页范围之内,也就是 “我指向谁,谁指向我”的记忆集

补充内容:记忆集可以避免垃圾扫描时进行全堆扫描节约时间

  • :并发标记阶段如何保证收集线程与用户线程互不干扰地运行?

答:
在回答这个问题前,我们需要了解两个概念:“增量更新”和“原始快照”

  • 增量更新:在并发标记过程中,用户线程新对象在GC Root上的某个Node相关联时,我们将这个新来的引用记录下来,并发标记结束后,重新对Node进行扫描,查看是否任然是关联关系。
  • 原始快照(SATB算法):对当前堆的关联关系进行快照保存,不管中途是新增还是删除,并发标记过程中,根据快照的关联关系进行扫描

在了解上面两个概念后,就可以回答这个问题了,G1使用的是原始快照,当然具体实现上肯定不止这么简单!!!


此外,G1为每个Region设计了两个名为:TAMS(Top at Mark Start)的指针,把Region中的一部分空间划分出来用于并发回收过程中的新对象分配,并发回收时新分配的对象地址都必须要在这两个指针位置上。G1收集器默认这个地址上的对象是被隐式标记过了,即默认他们是存活的。

  • :怎样建立起可靠的停顿预测模型?

答:
G1 收集器的停顿预测模型是以“衰减均值”为理论基础来实现的,在垃圾收集过程,G1收集器会记录每个Region的一些数据,例如:记忆集里面的脏数据、回收耗时等数据,进行计算,最终根据这个值来确认回收价值,在规定时间内,每次回收价值最大的。(详细过程,读者可以自行了解,这里不做过多赘述OWO)

G1的垃圾收集过程

G1的垃圾收集大致分为下面四个步骤:

  • 初始标记(Initial Marking)
    • 需要停顿线程,但是耗时非常短。
    • 仅标记GC Roots能直接关联到的对象,比修改TAMS的值,让下一阶段用户线程并发能正确在Region中分配对象
  • 并发标记(Concurrent Marking)
    • 与用户线程并发
    • 从GC Roots中递归查找可以回收的对象,耗时较长(对象数量决定), 扫描结束后,还需要重新处理SATB记录下的并发时有引用变动的对象
  • 最终标记(Final Marking)
    • 用户线程短暂停顿
    • 用于处理并发阶段结束后遗留下来的最后那少量的SATB记录
  • 筛选回收(Live Data Counting and Evacuation):
    • 暂停用户线程,并发回收
    • 对Region中的价值进行排序,然后打包多块Region收集,把存活的Region复制到另一个Region中,然后情况当前Region。这个过程设计对象移动所以需要暂停用户线程。
    • 堆内回收示意:在这里插入图片描述

到这一步其实也能看出来G1在一定程度上,不仅仅为了低延迟,还想方设法保证吞吐量,不然再最后回收阶段,他任然可以并发用户线程(ZGC是如此),下图是G1收集器运行过程图:
在这里插入图片描述


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

打赏作者

摸鱼儿hzj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值