G1垃圾收集器

G1收集器

G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备对个处理器以及大容量内存的机器。可以极高概率满足GC停顿时间要求,还有高吞吐量性能的特性。
G1把java堆划分成为多个大小相等的独立区域(Region),JVM最多可以有2048个Region。一个region的大小是堆大小除以2048,如果堆的大小是4096M,region的大小是2M,当然也可以使用参数“-XX:G1HeapRegionSize”手动指定region的大小,但是还是推荐默认的计算方式。
G1还是保留了年轻代和老年代的概念,但不再是物理隔离了,他们都属于region。默认年轻代堆内存的占比是5%,比如堆的大小是4096M,那么年轻代就占据200M左右的内存,对应大概是100个region,可以通过“-XX:G1NewSizePercent”来设置新生代初始的占比,在系统运行中,jvm会不停的给年轻代增加跟多的region,但是最多新生代的占比不会超过60%,也可以使用“-XX:G1MaxNewSizePercent”进行调整。年轻代中Eden和Survivor对应的region也是默认的8:1:1,如果年轻代有1000个region,eden区对应800个,s0对应100个 ,s1对应100个。一个region的区域功能可能会动态变化的。
G1垃圾收集器对应对象什么时候会进入老年代,和之前原则一样,唯一不同的是大对象的处理,G1有专门分配大对象的region叫Humongous区,而不是让大对象直接进入老年代的region。在G1中,大对象的判断条件是,如果这个对象的大小超过了一个region的50%,就会放入到Humongous中,如果一个大对象太大,就会放入对个region中。这样可以节约老年代的空间,避免老年代不够进行GC的开销。FULLGC的时候处理收集年轻代和老年代之外,也会收集Humongous区域。

G1垃圾收集器的过程

1.初始标记(STW):暂停所有的其它线程,并记录下gcroots直接能引用的对象,速度很快;
2.并发标记:和cms的并发标记一样。
3.最终标记:和CMS的重新标记一样。
4.筛选回收:筛选回收阶段要先对各个region的回收价值和成本进行排序,根据用户所期望的GC停顿时间(-XX:MaxGCPauseMillis)来制定回收计划。如果本次垃圾回收只能停顿200ms,那么通过回收成本计算得知,可能回收600个region就是200ms,那么就会只回收600个region,就算有多余的region也不就行回收了。不管是年轻代还是老年代,回收算法都是复制算法,G1采用复制算法回收几乎不会有太多的内存碎片。可能因为G1并发垃圾回收太复杂了,暂时没有实现并发回收。
在这里插入图片描述
G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的region(这也可能是他名字的由来),这种使用region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限时间内尽可能提高收集的效率。

G1的特点

1,。并行和并发:G1能充分利用cpu、多核,使用多个cpu来缩短stw停顿时间。G1仍然可以通过并发的方式让java程序继续执行。
2.分代收集:G1可以不需要其它收集器配合就可以独立管理整个GC堆,但是还保留了分代的概念
3.空间整合:G1从整体来看是基于"标记整理"算法,从局部上来看是基于复制算法实现的。
4.可预测的停顿:这是G1相对于cms的另一个大优势,降低停顿时间是G1和cms共同关注的点,G1可以建立可预测的停顿时间模型,让使用者明确指定在一个长度为M毫秒的时间片段内完成垃圾收集。
用户指定期望的停顿时间是G1收集器很强大的一个功能。但是期望值也不能定的太低,默认停顿时间是200ms,如果调的太低,很有可能导致垃圾慢慢堆积,最终占满堆引发full gc,性能会很低,一般设置100-300ms都很正常。

G1垃圾收集分类

1.YoungGC:
YoungGC不一定是Eden满了就触发,会先计算Eden区回收的大概时间,如果远小于参数-XX:MaxGCPauseMills的值,那么就继续增加年轻代的region,继续给新对象存放。直到时间接近设置的暂停时间的值,就会触发YoungGC.
2.MixedGC
如果老年的的堆占有率达到参数-XX:InitiatingHeapOccupancyPercent设定的值则会触发,回收所有的young和部分old以及大对象区,如果在复制的过程中没有足够的空region能承载拷贝对象,就会触发一次fullgc
3.full GC
停止系统程序,使用单线程,进行标记、清理和压缩整理,可以空闲出来一批Region来供下一次MixedGC使用,fullgc非常耗时。

G1使用的场景:1.50%以上的 堆被存活对象占用。2.对象分配和晋升的速度变化很大。3.垃圾回收时间很长。4.堆内存超过8G。5.停顿时间控制在500ms内的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JVM (Java Virtual Machine) G1 (Garbage-First) 垃圾收集器是一种用于 Java 应用程序的垃圾收集算法。它是自JDK 7u4版本后引入的一种全新的垃圾收集器G1垃圾收集器的设计目标是为了解决传统的分代垃圾收集器可能遇到的一些问题,如停顿时间长、内存碎片化等。它采用了一种基于区域的垃圾收集方式,可以将内存划分为多个大小相等的区域,每个区域可以是Eden、Survivor或Old区。 G1垃圾收集器的工作原理如下: 1. 初始标记(Initial Mark):标记所有从根对象直接可达的对象。 2. 并发标记(Concurrent Mark):在并发执行程序的同时,标记那些在初始标记阶段无法访问到的对象。 3. 最终标记(Final Mark):为并发标记阶段中发生改变的对象进行最终标记。 4. 筛选回收(Live Data Counting and Evacuation):根据各个区域的回收价值来优先回收价值低的区域。 G1垃圾收集器具有以下特点: - 并发执行:在执行垃圾收集过程时,尽可能减少应用程序的停顿时间。 - 分区回收:将整个堆划分为多个区域,可以根据需要优先回收垃圾较多的区域,从而避免全堆回收带来的长时间停顿。 - 内存整理:G1垃圾收集器会对内存进行整理,减少内存碎片化,提高内存利用率。 需要注意的是,G1垃圾收集器并不适用于所有情况。在特定的场景下,如大堆情况下的长时间运行、对延迟要求非常高的应用等,可能需要考虑其他垃圾收集器的使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独地卜师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值