3.Java 垃圾回收机制
·
3.Java 垃圾回收机制
-
一、垃圾回收的基本概念
- JVM 的垃圾回收器(Garbage Collector, GC )是 Java 内存管理的核心组件,负责 自动回收不再使用的对象,释放内存空间 。垃圾回收器的设计和实现直接影响 Java 应用的性能、吞吐量和延迟。
- 1. 什么是垃圾回收?
- 垃圾回收是指JVM自动管理内存的过程, 识别并回收不再使用的对象 ,释放内存空间。
- 垃圾回收的主要目标是:
- 提高内存利用率。
- 减少内存泄漏。
- 降低开发人员的内存管理负担。
- 2. 垃圾回收的对象
- 垃圾回收主要针对 堆内存 中的对象。
- 栈内存和方法区的内存由 JVM 自动管理,不涉及垃圾回收。
- 3. 垃圾回收的触发条件
- 新生代空间不足 :触发 Minor GC。
- 老年代空间不足 :触发 Full GC。
- 手动调用 :通过
System.gc()建议 JVM 执行垃圾回收(不保证立即执行)。
- 4.Minor GC 及 Full GC
- Minor GC 的回收过程
- 复制算法:
- (1)标记 :标记Eden区和Survivor From区中的存活对象。
- (2)复制 :将存活对象复制到Survivor To区。
- (3)清理 :清空Eden区和Survivor From区。
- (4)晋升 :将满足条件的对象移动到老年代(多次
Minor GC后仍然存活(默认经过15次))。
- Full GC 的回收过程
- (1)标记-清除算法
- (2)标记-整理算法
- (3)方法区回收 :
- 回收不再使用的类信息、常量池等。如果使用的是元空间(Metaspace),则会释放未使用的元空间内存。
- Full GC 是垃圾回收中最全面的回收过程,它会清理整个堆内存(包括年轻代、老年代)以及方法区(元空间或永久代)。但是效率较低,从调优角度看要减少使用Full GC。
- Minor GC 的回收过程
-
二、垃圾回收算法
- 1. 标记-清除算法(Mark-Sweep)
- 过程 :
- (1)标记:从根对象(如栈、静态变量)出发,标记所有可达存活对象。
- (2)清除:回收未被标记的垃圾对象。
- 优点 :
- 简单易实现。
- 缺点 :
- 产生内存碎片。
- 效率较低。
- 过程 :
- 2. 复制算法(Copying)
- 过程 :
- (1)将内存分为两块(From 和 To)。
- (2)将存活对象从 From 复制到 To。
- (3)清空 From 区域。
- 优点 :
- 无内存碎片。
- 效率高。
- 缺点 :
- 内存利用率低(只能使用一半内存)。
- 过程 :
- 3. 标记-整理算法(Mark-Compact)
- 过程 :
- (1)标记:标记所有可达对象。
- (2)整理:将存活对象向一端移动,清理边界外的内存。
- 优点 :
- 无内存碎片。
- 缺点 :
- 效率较低。
- 过程 :
- 4. 分代收集算法(Generational Collection)
- 思想 :
- (1)根据对象的生命周期将堆内存分为新生代(Young Generation)和老年代(Old Generation)。
- (2) 新生代 使用 复制算法 , 老年代 使用 标记-清除 或 标记-整理算法 。
- 优点 :
- 针对不同区域采用不同算法,提高效率。
- 思想 :
- 1. 标记-清除算法(Mark-Sweep)
-
三、JVM 堆内存的分代模型
- JVM 将堆内存分为以下几个区域:
- 1. 新生代(Young Generation)
- 特点 :
- 存放新创建的对象。
- 对象生命周期较短。
- 区域划分 :
- (伊甸园)Eden 区 :新对象首先分配在 Eden 区。
- (幸存者)Survivor 区 :分为 From 和 To 两个区域,To区存放经过
Minor GC后存活的对象。Survivor From区和Survivor To区的角色会在每次GC后互换。
- 垃圾回收 :
- 使用 复制算法 。
- 触发
Minor GC。
- 特点 :
- 2. 老年代(Old Generation)
- 特点 :
- 存放长期存活的对象。
- 对象生命周期较长。
- 垃圾回收 :
- 使用 标记-清除 或 标记-整理 算法。
- 触发
Full GC。
- 特点 :
- 3. 元空间(Metaspace)
- 特点 :
- 存放类的元数据(如类信息、方法信息等)。
- JDK 8 之前称为永久代(PermGen)。
- 垃圾回收 :
- 类的卸载由
Full GC触发。
- 类的卸载由
- 特点 :
-
四、JVM 垃圾回收器
- 1. Serial GC
- 特点 :
- 单线程垃圾回收器。
- 适用于单核 CPU 或小型应用。
- 使用场景 :
- 客户端应用或嵌入式系统。
- 参数 :
**-XX:+UseSerialGC**- -XX:表示这是一个 JVM 的扩展参数(非标准参数)
- 特点 :
- 2. Parallel GC(吞吐量优先)
- 特点 :
- 多线程垃圾回收器。
- 注重吞吐量(Throughput)。
- 使用场景 :
- 后台处理任务或批处理系统。
- 参数 :
**-XX:+UseParallelGC**
- 特点 :
- 3. CMS GC(Concurrent Mark Sweep)
- 特点 :
- 并发垃圾回收器。
- 注重低延迟(Low Latency)。
- 使用场景 :
- Web 应用或实时系统。
- 缺点 :
- 内存碎片问题。
- 参数 :
**-XX:+UseConcMarkSweepGC**
- 特点 :
- 4. G1 GC(Garbage First)
- 特点 :
- 面向服务端应用的垃圾回收器。
- 将堆内存划分为多个区域(Region),优先回收垃圾最多的区域。
- 兼顾吞吐量和低延迟。
- 使用场景 :
- 大内存、多核 CPU 的应用。
- 参数 :
**-XX:+UseG1GC**
- 特点 :
- 5. ZGC(Z Garbage Collector)
- 特点 :
- 低延迟垃圾回收器。
- 支持 TB 级堆内存。
- 停顿时间不超过 10ms。
- 使用场景 :
- 对延迟敏感的大型应用。
- 参数 :
**-XX:+UseZGC**
- 特点 :
- 6. Shenandoah GC
- 特点 :
- 低延迟垃圾回收器。
- 与 ZGC 类似,但实现方式不同。
- 使用场景 :
- 对延迟敏感的应用。
- 参数 :
**-XX:+UseShenandoahGC**
- 特点 :
- 1. Serial GC
-
五、垃圾回收器的选择
- 选择合适的垃圾回收器需要根据应用的需求和硬件环境:
- 选择合适的垃圾回收器需要根据应用的需求和硬件环境:
-
六、垃圾回收器的调优
- 1. 堆内存调优
- 参数 :
**-Xms**:初始堆大小。**-Xmx**:最大堆大小。
- 建议 :
- 将 -Xms 和 -Xmx 设置为相同值,避免堆内存动态扩展。
- 参数 :
- 2. 新生代调优
- 参数 :
**-Xmn**:新生代大小。
- 建议 :
- 新生代大小通常为堆内存的 1/3 到 1/4。
- 参数 :
- 3. 垃圾回收器参数
- G1 GC :
**-XX:MaxGCPauseMillis**:设置最大停顿时间。**-XX:G1HeapRegionSize**:设置区域大小。
- ZGC :
**-XX:ZAllocationSpikeTolerance**:调整分配尖峰容忍度。
- G1 GC :
- 1. 堆内存调优
-
七、垃圾回收器的监控与诊断
- 1. 监控工具
- jstat :
- 监控垃圾回收统计信息。
- 示例:
jstat -gc <pid> 1000
- VisualVM :
- 图形化监控工具,支持垃圾回收分析。
- GC Log :
- 启用 GC 日志,记录垃圾回收的详细信息。
- 参数:
-Xloggc:<file> -XX:+PrintGCDetails -XX:+PrintGCDateStamps
- jstat :
- 2. 诊断工具
- jmap :
- 生成堆转储文件(Heap Dump)。
- 示例:
jmap -dump:format=b,file=heap.bin <pid>
- Eclipse MAT :
- 分析堆转储文件,查找内存泄漏。
- jmap :
- 1. 监控工具
更多推荐



所有评论(0)