JVM垃圾回收中的道法术器
JVM垃圾回收中的“道法术器”体系解析
一、道(原理与哲学)
自动内存管理的核心理念
JVM垃圾回收(GC)的本质是通过自动化管理内存生命周期,避免内存泄漏和溢出。其核心哲学是“无感知回收”,开发者无需手动管理对象内存,降低心智负担。
• 可达性分析算法:通过GC Roots(如虚拟机栈、静态变量等)构建引用链,判断对象是否存活。未被引用的对象标记为垃圾(如Object5、Object6、Object7在引用链外)。• 分代假设:根据对象存活时间将堆划分为年轻代(Young Generation)和老年代(Old Generation),采用不同回收策略(如年轻代用复制算法,老年代用标记整理)。
引用强度的层次性
• 强引用(如Object obj = new Object()
):即使内存不足也不会被回收。• 软引用/弱引用:分别在内存紧张时或下一次GC时回收,适用于缓存场景。
• 虚引用:仅用于对象回收时的系统通知。
二、法(算法与策略)
经典垃圾回收算法
• 标记-清除:分两阶段扫描内存,标记不可达对象后清除。优点简单直接;缺点内存碎片化(如图3中的内存空洞)。• 复制算法:将内存分为两半,存活对象复制到另一半后清空原区域。优点无碎片;缺点内存利用率低(仅50%)。
• 标记-整理:标记后移动存活对象至内存前端,解决碎片问题(如图5),但耗时较长。
分代收集的实践
• 年轻代:Eden区新对象快速分配,Survivor区通过复制算法筛选存活对象(如From/To区交替使用)。• 老年代:采用标记整理或并发标记清除(CMS),减少长时间停顿。
三、术(垃圾收集器实现)
按代划分的经典收集器
• Serial GC:单线程STW回收,适用于客户端或小内存场景。• Parallel GC(吞吐量优先):多线程并行回收,适合计算密集型任务。
• CMS:并发标记清除,减少停顿时间,但存在内存碎片问题(JDK9后废弃)。
新一代收集器
• G1(Garbage-First):以Region为单元划分堆,优先回收垃圾最多的区域(Mixed GC模式),支持可预测停顿(如-XX:MaxGCPauseMillis=200
)。◦ Region设计:支持Eden、Survivor、Old和Humongous分区,解决大对象处理难题。
◦ RSet(记忆集):记录跨代引用,避免全堆扫描(如老年代引用年轻代对象)。
• ZGC:基于染色指针和读屏障实现亚毫秒级停顿(<10ms),支持TB级堆内存(JDK15+生产可用)。
• Shenandoah:类似ZGC,但通过Brooks指针实现并发整理,适用于低延迟场景。
四、器(工具与调优)
JVM参数配置
• 堆内存:-Xmx
(最大堆)、-Xmn
(年轻代大小)。• 收集器选择:
-XX:+UseG1GC
(启用G1)、-XX:+UseZGC
(启用ZGC)。监控与诊断工具
• 命令行工具:jstat
(实时监控GC统计)、jmap
(堆转储分析)、jstack
(线程堆栈跟踪)。• 图形化工具:JConsole、VisualVM(可视化堆内存与GC活动)。
• GC日志分析:通过
-XX:+PrintGCDetails
记录详细回收过程,结合工具(如GCViewer)优化停顿时间。
总结与选型建议
• 低延迟场景:优先选择G1、ZGC或Shenandoah。
• 高吞吐量场景:Parallel GC或G1的默认模式。
• 超大堆内存:ZGC(TB级)或分代ZGC(JDK21+)。
• 调优核心:通过监控工具分析GC日志,平衡吞吐量、延迟和内存占用(如调整Region大小、并发线程数)。