GC基本原理

  1. 可达性分析算法
    Java通过根可达性分析判断对象存活状态。从GC Roots(如虚拟机栈引用的对象、静态变量、JNI 引用等)出发,遍历对象引用链,未被引用的对象标记为可回收。
    优势:解决循环引用问题,避免内存泄漏。
  2. 垃圾回收算法

    • 标记-清除(Mark-Sweep):标记存活对象后清除未标记对象,但会产生内存碎片。
    • 复制算法:将内存分为Eden和Survivor区,存活对象复制到另一区域,适合新生代(空间利用率50%)。
    • 标记-整理(Mark-Compact):标记后压缩存活对象至内存一端,消除碎片,适合老年代。
    • 分代算法:结合对象生命周期,新生代用复制算法,老年代用标记整理。

分代回收机制

Java堆分为新生代和老年代,不同区域采用差异化回收策略:

  1. 新生代结构

    • Eden区:新对象分配的主要区域(默认占80%)。
    • Survivor区(S0/S1):Minor GC后存活对象在此复制,年龄计数器决定晋升老年代(默认阈值15)。
  2. GC类型与触发条件

    • Minor GC:Eden区满时,高频、快速,存活对象复制到Survivor区。
    • Major GC/Full GC:老年代空间不足、方法区(元空间)满载或显式调用System.gc()时触发,耗时较长。
    • Mixed GC(G1特有):同时回收部分新生代和老年代Region。
  3. 对象晋升规则

    • 年龄阈值:对象在Survivor区每存活一次Minor GC年龄+1,达阈值则晋升。
    • 动态年龄判断:同年龄对象总大小超Survivor区一半时,直接晋升。

GC触发条件与优化策略

  1. 触发条件:

    • Minor GC:Eden区分配失败、TLAB(线程本地分配缓存)不足。
    • Full GC:老年代空间不足、永久代(元空间)满载、System.gc()调用。
  2. 调优策略:

    • -Xmx/-Xms:设置最大/初始大小,避免动态扩展引发Full GC。
    • -XX:MaxTenuringThreshold:调整对象晋升年龄阈值。
    • -XX:+UseG1GC:启用G1收集器,平衡吞吐与延迟。
    • 避免大对象直接进入老年代(如大数组)。
    • 减少全局变量和静态集合类引用,防止内存泄漏。

经典分代收集器

  1. Serial收集器

    • 特点:单线程执行,全程STW(Stop-The-World),采用复制算法(新生代)和标记-整理算法(老年代)。
    • 适用场景:单核CPU、小内存(如嵌入式系统)或客户端应用。
    • 代偿代价:停顿时间长(秒级),无法利用多核性能。
  2. ParNew收集器

    • 特点:Serial的多线程版本,仅用作新生代,需与CMS收集器配合使用。
    • 适用场景:多核服务器中需与CMS搭配的场景(如JDK8前)。
    • 限制:JDK9后逐渐被废弃,与CMS的兼容性要求高。
  3. Parallel Scavenge(吞吐量收集器)

    • 特点:多线程并行回收,以最大化吞吐量为目标,支持自适应调节策略(如动态调整堆分区比例)。
    • 适用场景:后台计算型任务(如数据批处理)。
    • 代偿代价:牺牲单次停顿时间(可达数百毫秒)。
  4. CMS(Concurrent Mark-Sweep)

    • 特点:并发标记清除,分四阶段(初始标记->并发标记->重新标记->并发清除),仅部分阶段STW。
    • 适用场景:延迟敏感的Web服务(如电商系统)
    • 缺陷:内存碎片(需定期Full GC整理)、高CPU占用。

全堆与低延迟收集器

  1. G1(Garbage-First)

    • 特点:将堆划分为多个Region(默认2048个),优先回收垃圾比例高的Region,支持可预测停顿时间。
    • 适用场景:大内存(>6GB)服务端应用。
    • 优势:平衡吞吐量与延迟,内存碎片率低于CMS。
  2. ZGC(Z Garbage Collector)

    • 特点:全并发操作(染色指针技术),亚毫秒级停顿(<10ms),支持TB级别内存。
    • 适用场景:实时系统(如金融交易)、超大内存应用。
    • 代价:高CPU和内存带宽消耗,小堆性能反而不如G1.
  3. Shenandoan

    • 特点:类似ZGC的全并发设计(Brooks指针),低停顿且开源,与ZGC竞争。
    • 适用场景:需极低延迟且避免厂商绑定(如云原生环境)。

JVM调优

关键参数模版:

# G1调优模板(Web服务场景)
-Xmx8g -Xms8g 
-XX:+UseG1GC 
-XX:MaxGCPauseMillis=200 
-XX:InitiatingHeapOccupancyPercent=45 
-XX:ConcGCThreads=4 
-XX:G1ReservePercent=10

# ZGC调优模板(低延迟场景)
-Xmx16g -Xms16g 
-XX:+UseZGC 
-XX:ConcGCThreads=8 
-XX:SoftMaxHeapSize=14g
参数类型示例参数作用说明
堆内存分配-Xmx4g -Xms4g避免堆动态扩容触发Full GC
GC算法选择-XX:+UseG1GC指定G1收集器
停顿时间控制-XX:MaxGCPauseMillis=200G1目标最大停顿时间
并行GC线程数-XX:ParallelGCThreads=4根据CPU核心数调整
元空间限制-XX:MaxMetaspaceSize=512m防止元空间无限增长

博弈
2.5k 声望1.5k 粉丝

态度决定一切


« 上一篇
Flink 下载运行
下一篇 »
Java多线程

引用和评论

0 条评论