JVM 垃圾回收(GC)算法与调优 - 实践
一、垃圾回收基础概念
1. 判断对象存活的算法
引用计数法:每个对象维护一个引用计数器(Python采用)
缺点:无法处理循环引用挑战
可达性分析法(JVM使用):从GC Roots出发,不可达的对象判定为可回收
GC Roots包括:虚拟机栈中引用的对象、方法区静态属性引用的对象、方法区常量引用的对象、本地方法栈中JNI引用的对象等
2. 引用类型
强引用:普通对象引用,不会被GC回收
软引用(SoftReference):内存不足时回收
弱引用(WeakReference):下次GC时回收
虚引用(PhantomReference):无法通过虚引用获取对象,重要用于跟踪对象被回收的活动
二、垃圾回收算法
1. 基础回收算法
标记-清除(Mark-Sweep)
步骤:标记存活对象 → 清除未标记对象
缺点:产生内存碎片
复制算法(Copying)
将内存分为两块,只使用一块,GC时将存活对象复制到另一块
优点:无碎片;缺点:内存利用率低
适用于新生代(Eden区采用此算法)
标记-整理(Mark-Compact)
步骤:标记存活对象 → 将存活对象向一端移动 → 清理边界外内存
适用于老年代
分代收集算法(Generational Collection)
新生代:复制算法(Eden + Survivor)
老年代:标记-清除或标记-整理
2. 现代GC算法实现
Serial GC:单线程,适合客户端应用
Parallel GC(吞吐量优先):多线程并行GC
CMS(Concurrent Mark-Sweep):低延迟,已废弃
G1(Garbage-First):JDK9+默认,面向服务端
ZGC:JDK11+,超低延迟(<10ms)
Shenandoah:RedHat开发,低延迟GC
三、垃圾回收器
垃圾回收器是 Java 虚拟机(JVM)的核心组成部分之一,它自动管理着 Java 程序的内存,负责自动回收不再被使用的对象所占用的内存,从而避免了内存泄漏和手动管理内存的复杂性。
1. 核心概念:分代收集理论
当前主流
浙公网安备 33010602011771号