JVM 垃圾回收
什么是垃圾回收
垃圾回收(Garbage Collection, GC)是 Java 虚拟机(JVM)中的一个重要机制,用于自动管理和回收不再使用的内存空间。
垃圾回收的对象
JVM 中的垃圾回收主要针对堆内存中的对象实例。当一个对象不再被任何其他对象引用时,就会被标记为垃圾对象,等待被回收。
垃圾回收算法
1. 标记-清除算法(Mark-Sweep)
- 标记阶段:标记所有存活的对象
- 清除阶段:回收未被标记的对象
- 缺点:会产生内存碎片
2. 复制算法(Copying)
- 将内存分为两块,每次只使用其中一块
- 当这一块内存用完,将存活对象复制到另一块
- 优点:不会产生内存碎片
- 缺点:内存使用率低
3. 标记-整理算法(Mark-Compact)
- 标记阶段:标记存活对象
- 整理阶段:将存活对象向一端移动
- 优点:不会产生内存碎片
- 缺点:移动对象成本较高
4. 分代收集算法
- 将堆内存分为新生代和老年代
- 新生代使用复制算法
- 老年代使用标记-清除或标记-整理算法
垃圾收集器
JVM 提供了多种垃圾收集器,适用于不同的场景:
1. Serial 收集器
- 单线程收集器
- 工作时需要暂停所有用户线程(Stop The World)
- 简单高效,适用于单 CPU 环境
- 新生代采用复制算法,老年代采用标记-整理算法
2. ParNew 收集器
- Serial 收集器的多线程版本
- 除了使用多线程进行垃圾收集外,其他特性与 Serial 收集器一样
- 是 CMS 收集器的默认搭配收集器
3. Parallel Scavenge 收集器
- 新生代收集器,使用复制算法
- 并行多线程收集
- 关注吞吐量(运行用户代码时间/(运行用户代码时间+垃圾收集时间))
- 提供自适应调节策略
4. CMS(Concurrent Mark Sweep)收集器
- 以获取最短回收停顿时间为目标
- 基于标记-清除算法
- 并发收集,用户线程和垃圾收集线程同时工作
- 适用于对响应时间要求较高的应用
5. G1(Garbage First)收集器
- 面向服务端应用的收集器
- 可以充分利用多 CPU、多核环境
- 将堆内存划分为多个大小相等的 Region
- 可预测的停顿时间模型
- JDK 9 后的默认垃圾收集器
6. ZGC 收集器
- JDK 11 中推出的低延迟垃圾收集器
- 基于 Region 内存布局
- 使用了读屏障、染色指针等技术
- 停顿时间不超过 10ms
GC 调优
常用参数
-Xms: 初始堆大小-Xmx: 最大堆大小-XX:NewRatio: 新生代和老年代的比例-XX:SurvivorRatio: Eden 区和 Survivor 区的比例-XX:+UseSerialGC: 使用 Serial + Serial Old 收集器-XX:+UseParNewGC: 使用 ParNew + Serial Old 收集器-XX:+UseParallelGC: 使用 Parallel Scavenge + Parallel Old 收集器-XX:+UseConcMarkSweepGC: 使用 ParNew + CMS + Serial Old 收集器-XX:+UseG1GC: 使用 G1 垃圾收集器
调优策略
- 选择合适的垃圾收集器
- 合理设置内存大小
- 优化代码减少对象创建
- 及时释放无用对象
- 监控 GC 日志进行分析
