centos

CentOS Java垃圾回收机制解析

小樊
41
2025-08-14 13:33:04
栏目: 编程语言

CentOS上的Java垃圾回收机制基于JVM实现,核心是通过分代收集和多种垃圾回收器组合管理内存,以下是关键解析:

一、核心原理

  1. 对象存活判定

    • 可达性分析算法:从GC Roots(如栈局部变量、静态变量、JNI引用等)出发,标记不可达对象为垃圾。
    • 引用类型:强引用(默认,不回收)、软引用(内存不足时回收)、弱引用(下次GC回收)、虚引用(仅用于回收通知)。
  2. 垃圾回收算法

    • 标记-清除:标记不可达对象并清除,产生内存碎片,用于老年代。
    • 复制算法:将存活对象复制到新区域,避免碎片,用于新生代(Eden区→Survivor区)。
    • 标记-整理:将存活对象移至一端,清理边界外内存,用于老年代减少碎片。
    • 分代收集
      • 新生代(小空间、高频回收):采用复制算法,分为Eden区(新对象)和Survivor区(幸存对象)。
      • 老年代(大空间、低频回收):采用标记-清除或标记-整理算法,存放长期存活对象。

二、主流垃圾回收器

类型 特点 适用场景 参数
Serial 单线程,STW(Stop The World)停顿时间长,简单高效 客户端/小内存应用 -XX:+UseSerialGC
Parallel 多线程并行回收,追求高吞吐量,STW较长 后台计算、批处理任务 -XX:+UseParallelGC
CMS 并发标记清除,减少STW,但会产生碎片,需配合Serial Old处理老年代 低延迟Web服务(JDK9已标记废弃) -XX:+UseConcMarkSweepGC
G1 分Region回收,可预测停顿,优先回收垃圾多的区域,支持大内存 大内存、高响应应用(JDK9+默认) -XX:+UseG1GC
ZGC/Shenandoah 超低延迟(<10ms),全程并发,支持TB级堆内存(Java 11+引入) 金融交易、超大规模数据处理 -XX:+UseZGC

三、关键配置与优化

  1. 内存参数

    • -Xms/-Xmx:设置堆初始和最大内存(建议相等,避免动态调整开销)。
    • -Xmn:设置新生代大小,影响Minor GC频率(默认占堆的1/3)。
    • -XX:SurvivorRatio:设置Eden与Survivor区比例(默认8:1:1)。
  2. GC策略选择

    • 高吞吐量:选择Parallel GC,适合后台计算任务。
    • 低延迟:选择G1/ZGC,适合Web服务、实时系统。
    • 避免碎片:老年代优先使用标记-整理算法(如Serial Old、Parallel Old)。
  3. 监控与调优工具

    • jstat:监控GC次数、耗时等指标。
    • jmap/jhat:生成堆转储文件,分析内存泄漏。
    • VisualVM/Arthas:可视化分析GC行为、对象引用链。

四、注意事项

参考来源:[1,2,3,4,5,6,7,8,9,10,11]

0
看了该问题的人还看了