JVM youngGc FullGc的触发条件

本文深入解析了Java垃圾回收机制中的YoungGC和FullGC触发条件,包括年轻代Eden区满载、对象晋升到老年代的多种途径,以及老年代、元空间等区域内存使用率达到阈值时触发的FullGC条件。
  • youngGc触发条件
  1. 大多数情况下,对象直接在年轻代中的Eden区进行分配,如果Eden区域没有足够的空间,那么就会触发YGC(Minor GC)
  • 进入老年代的途径
  1. YGC时,To Survivor区不足以存放存活的对象,对象会直接进入到老年代。

  2. 经过多次YGC后,如果存活对象的年龄达到了设定阈值,则会晋升到老年代中。

  3. 动态年龄判定规则,To Survivor区中相同年龄的对象,如果其大小之和占到了 To Survivor区一半以上的空间,那么大于此年龄的对象会直接进入老年代,而不需要达到默认的分代年龄。

  4. 大对象:由-XX:PretenureSizeThreshold启动参数控制,若对象大小大于此值,就会绕过新生代, 直接在老年代中分配。

  • FullGc触发条件
  1. 老年代的内存使用率达到了一定阈值(可通过参数调整),直接触发FGC
  2. 空间分配担保:在YGC之前,会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果小于,说明YGC是不安全的,则会查看参数 HandlePromotionFailure 是否被设置成了允许担保失败,如果不允许则直接触发Full GC;如果允许,那么会进一步检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于也会触发 Full GC
  3. Metaspace(元空间)在空间不足时会进行扩容,当扩容到了-XX:MetaspaceSize 参数的指定值时,也会触发FGC
  4. System.gc() 或者Runtime.gc() 被显式调用时,触发FGC
<think>我们正在讨论JVMFull GCFull Garbage Collection,全垃圾回收)的含义。用户可能是在了解JVM垃圾回收机制,特别是Full GC的特性和影响。根据引用[1],Full GC被比喻为“大扫除”,说明它是一个全面的垃圾回收过程,虽然必要但代价较高。下面我将详细解释Full GC的含义,并按照要求组织回答。 ### 核心概念 1. **Full GC的定义**: Full GC是指JVM对**整个堆内存**(包括年轻代、老年代)以及**方法区**(或元空间)进行垃圾回收的过程。与只针对年轻代的Minor GC相比,Full GC的范围更广,耗时更长。 2. **触发条件**: - **老年代空间不足**:当对象从年轻代晋升到老年代时,若老年代空间不足(例如由于内存泄漏或对象过大),会触发Full GC。 - **方法区空间不足**:方法区(或元空间)使用超过阈值触发。 - **显式调用**:通过`System.gc()`或`jmap -dump:live`等命令强制触发。 - **其他策略**:如G1收集器根据预测的停顿时间模型自动触发。 3. **执行过程**: - **Stop-The-World(STW)**:Full GC需要暂停所有应用线程,进行垃圾回收。 - **标记-清除-压缩**: 1. **标记(Mark)**:遍历所有GC Roots,标记存活对象。 2. **清除(Sweep)**:回收垃圾对象占用的空间。 3. **压缩(Compact)**:(可选)整理内存碎片,减少未来分配失败。 ### Full GC的代价与优化目标 - **暂停时间长**:STW期间服务不可用,大堆(如数十GB)可能导致秒级甚至分钟级卡顿。 - **资源消耗高**:CPU和内存带宽占用剧增。 - **优化方向**: - **减少频率**:增大堆内存、优化对象分配[^1]。 - **缩短耗时**:选择低延迟收集器(如ZGC、Shenandoah)或调整GC参数(如并行线程数)。 ### 不同收集器的Full GC行为 | 收集器 | Full GC行为 | |----------------|---------------------------------------------------------------------------| | **Serial** | 单线程STW,效率最低 | | **Parallel** | 多线程并行回收,但仍有STW | | **CMS** | 并发收集,但并发失败时会退化为单线程Full GC(更慢) | | **G1** | 并发标记+并行回收,Full GC(如混合回收)暂停可控 | | **ZGC/Shenandoah** | 全程并发,暂停时间极短(通常<1ms) | > **关键点**:Full GCJVM内存管理的“终极手段”,应通过监控和调优尽量避免其频繁发生。 ### 代码示例:监控Full GC 通过JVM参数记录GC日志,分析Full GC频率和耗时: ```bash # 启用GC日志(JDK 8示例) java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log -jar app.jar ``` 日志片段解析: ``` 2024-06-18T10:00:01.123+0800: [Full GC (Ergonomics) ... [PSYoungGen: 1024K->0K(2048K)] [ParOldGen: 4096K->1024K(8192K)] 5120K->1024K(10240K), [Metaspace: 256K->256K(1024K)], 0.0310020 secs] ``` - `Full GC`:事件类型。 - `ParOldGen`:老年代回收前后大小。 - `0.0310020 secs`:耗时31毫秒。 --- §§相关问题§§ 1. 如何通过GC日志分析Full GC的具体原因? 2. 哪些场景会频繁触发Full GC? 3. ZGC如何实现亚毫秒级暂停? 4. 如何设置JVM参数以减少Full GC的发生频率? [^1]: CMS收集器在并发回收失败时会触发单线程Full GC。 </think> ### JVM Full GC 的含义与深度解析 #### 1. **基本定义** Full GCFull Garbage Collection)是 JVM 中**全局性垃圾回收**过程,会对**整个堆内存**(新生代 + 老年代)和**方法区**(或元空间)进行扫描清理。其核心特征是 **Stop-The-World (STW)** —— 暂停所有应用线程,直到回收完成[^1]。 #### 2. **关键特征** | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **回收范围** | 新生代(Young Gen)、老年代(Old Gen)、方法区/元空间(Metaspace) | | **暂停机制** | STW(所有应用线程冻结) | | **耗时** | 与堆大小成正比(例如 10GB 堆可能暂停 5-20 秒) | | **触发条件** | 老年代空间不足、方法区溢出、显式调用 `System.gc()` 或 `jmap -dump:live` | #### 3. **与 Minor GC 的对比** $$ \begin{array}{|c|c|c|} \hline \text{类型} & \text{回收范围} & \text{STW 时长} \\ \hline \textbf{Minor GC} & \text{仅新生代} & \text{毫秒级(通常 < 100ms)} \\ \hline \textbf{Full GC} & \text{全堆 + 方法区} & \text{秒级(可能 > 10秒)} \\ \hline \end{array} $$ #### 4. **执行过程** Full GC 通常分为三个阶段: 1. **标记(Mark)**: 遍历所有 GC Roots(线程栈、静态变量等),标记存活对象。 2. **清除(Sweep)**: 回收未被标记的垃圾对象内存。 3. **压缩(Compact)**:(可选) 整理内存碎片(如 CMS 收集器的 `-XX:+UseCMSCompactAtFullCollection`)。 #### 5. **性能影响与优化目标** - **代价高昂**: 长时间 STW 会导致服务卡顿、超时甚至雪崩。 - **JVM 进化方向**: 通过 ZGC/Shenandoah 等收集器实现 **亚毫秒级暂停**,核心目标是: - 减少 Full GC 频率 - 缩短 STW 时间 - 避免内存碎片 > **本质**:Full GCJVM 内存管理的“安全阀”,但频繁发生通常意味着代码缺陷(如内存泄漏)或配置不当(如堆大小不合理)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值