G1收集器优化总结

G1垃圾回收原理及参数优化

         随着jdk的升级,原CP+CMS的垃圾回收机制 被G1替代,从jdk11开始默认为G1垃圾回收。

G1垃圾回收原理

        将内存分为2048个块,每块大小为1-32M,所以jvm的内存一定是2G-64G,所以如果内存不再此范围内需要进行复杂调参(不用G1更好)。对象存储在每个块中(region),会按块进行标记内存回收

edengc:初始标记为eden区,当到达一定阈值时进行回收,满阈值(8)到老年代

mixgc: eden和old一起标记,引用或满阈值标记到老年代,该回收回收,但不超过配置的

-XX:MaxGCPauseMillis 

fullgc: 一定要GC完

因为region本身不区分是否是old,所以不存在物理上的 年轻代 老年代,但也会逻辑上控制,默认eden的region在10%--60%之间,用以提高性能,但具体多少是根据GC情况动态调整的

参数优化

        根据以上,G1是一个自动调优的算法,主要影响参数:内存大小,暂停毫秒数

所以关键参数为:-Xms -Xmx -XX:MaxGCPauseMillis

因为时并发标记,而且有指定暂停时间,所以在高并发场景下,将参数值往大调即可,当然到达原CMS那种调优结果(如可控稳定fullGC)是很难的

<think>好的,用户问的是G1收集器如何处理大对象。我需要先回忆一下G1的基本机制,特别是关于大对象的处理方式。G1将堆内存划分为多个大小相等的Region,每个Region可以是Eden、Survivor或Old区的一部分。大对象的处理在G1中有特殊处理,因为它们可能无法放入单个Region中。 首先,大对象在G1中被称为Humongous对象。当一个对象的大小超过一个Region的一半时,就会被标记为Humongous。这时候,G1会将这些对象直接分配到老年代的Humongous Region中。这可能与普通对象不同,普通对象通常先分配到年轻代,经过多次GC后晋升到老年代。 接下来,需要考虑Humongous对象的回收时机。由于它们位于老年代,通常会在Mixed GC中被回收。Mixed GC会同时处理年轻代和部分老年代的Region,包括Humongous Region。但这里可能存在效率问题,因为Humongous对象可能占用多个连续的Region,回收时需要处理这些连续区域。 另外,Humongous对象的分配和回收可能会导致内存碎片。因为它们需要连续的多个Region,如果频繁分配和释放大对象,可能导致无法找到足够大的连续空间,从而触发Full GC,这会影响性能。G1如何管理这些Humongous Region的分配和回收策略是关键点。 还需要提到G1的一些优化措施,比如Humongous对象的回收时机,是否在Young GC中处理,或者只在Mixed GC中处理。此外,可能涉及参数调优,如调整Region大小,或者控制Humongous对象的分配阈值,以减少内存浪费。 用户可能关心如何避免大对象导致的性能问题,比如Full GC频繁发生。这时候需要给出建议,如合理设置Region大小,避免频繁创建大对象,或者使用特定参数来优化Humongous分配。 最后,要检查是否有遗漏点,比如Humongous对象的标记和根节点处理,是否影响并发标记阶段的效率。可能还要提到G1对Humongous对象的特殊标记过程,比如在标记阶段如何处理这些大对象,以及回收后的内存整理策略。 总结回答结构:先解释Humongous对象的定义和分配策略,再说明其回收机制,接着讨论可能的性能问题及优化方法,最后给出相关问题建议。</think>G1(Garbage-First)垃圾收集器通过 **Humongous Region** 机制处理大对象(通常指大小超过单个Region容量50%的对象),其核心策略如下: --- ### **1. 大对象的定义与分配** - **判定阈值**: 当对象大小超过 **单个Region容量的一半**(默认值,可通过`-XX:G1HeapRegionSize`调整Region大小,范围1MB~32MB),则被标记为Humongous对象。 - **分配规则**: - Humongous对象**直接分配到老年代的Humongous Region**(而非年轻代),避免频繁复制。 - 若对象需要多个连续Region(如大小为3.5个Region),G1会分配连续的Humongous Region链。 --- ### **2. Humongous Region的管理** - **存储结构**: - 每个Humongous Region链由**起始Region**和**连续的辅助Region**组成,起始Region记录对象头信息。 - **内存浪费问题**:若对象未占满最后一个Region,剩余空间无法复用(类似内存对齐的开销)。 - **回收策略**: - Humongous对象的回收**仅在Mixed GC阶段触发**(不参与Young GC),通过标记-清理算法回收。 - 回收时会释放整个Region链,避免碎片化。 --- ### **3. 性能影响与优化** - **潜在问题**: 1. **内存浪费**:小对象占用大Region或未填满最后一个Region链。 2. **分配压力**:频繁创建Humongous对象可能导致Region链分配失败,触发Full GC。 3. **标记开销**:并发标记阶段需扫描Humongous对象,增加CPU负载。 - **优化建议**: 1. **调整Region大小**: 若应用频繁分配大对象,可增大`G1HeapRegionSize`(如从默认4MB调整为8~16MB),减少Region链数量。 ```bash -XX:G1HeapRegionSize=8M ``` 2. **控制Humongous分配阈值**: 通过`-XX:G1HumongousThreshold`调整大对象判定阈值(默认50%)。 ```bash -XX:G1HumongousThreshold=60 # 提高阈值,减少Humongous对象数量 ``` 3. **监控GC日志**: 关注Humongous对象的分配与回收频率,避免Full GC频繁触发。 ```bash # GC日志示例(Humongous对象分配) [allocation failure] GC pause (G1 Evacuation Pause) (young) (to-space exhausted) ``` --- ### **4. 回收流程示例** ```bash # Mixed GC回收Humongous对象的GC日志片段 [GC pause (Mixed) (1111111K->1010101K, 0.1234567 secs] [Eden: 1234M(1234M)->0B(1234M) Survivors: 123M->123M Heap: 1111111K(2222222K)->1010101K(2222222K)] [Humongous regions: 45->30] # Humongous Region数量从45减少到30 ``` --- ### **关键参数总结** | 参数 | 作用 | 示例值 | |------|------|--------| | `-XX:G1HeapRegionSize` | 设置Region大小 | 8M | | `-XX:G1HumongousThreshold` | 调整Humongous对象判定阈值 | 60 | | `-XX:MaxGCPauseMillis` | 控制目标停顿时间(影响Mixed GC频率) | 200 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值