Shenandoah垃圾回收器
Shenandoah垃圾回收器
Shenandoah是Red Hat开发的低延迟垃圾回收器,通过转发指针实现并发压缩,与ZGC并称为新一代GC双雄。
核心特性
/**
* Shenandoah核心特点:
* 1. 暂停时间与堆大小无关
* 2. 并发压缩,消除内存碎片
* 3. 支持多种GC模式
* 4. OpenJDK 12+默认可用
*/
启用Shenandoah
# 基本配置
java -XX:+UseShenandoahGC -jar app.jar
# 完整配置
java -XX:+UseShenandoahGC \
-XX:ShenandoahGCHeuristics=compact \
-XX:ShenandoahMinFreeThreshold=10 \
-XX:ShenandoahUncommitDelay=5000 \
-Xms16g -Xmx16g \
-jar app.jar
GC模式
# 三种启发式模式
# 1. static:固定触发阈值
-XX:ShenandoahGCHeuristics=static
# 2. adaptive:自适应(默认)
-XX:ShenandoahGCHeuristics=adaptive
# 3. compact:积极压缩
-XX:ShenandoahGCHeuristics=compact
监控Shenandoah
# GC日志
java -Xlog:gc* -XX:+UseShenandoahGC -jar app.jar
# 输出示例:
# [2024-01-15T10:30:00.123+0800][info][gc] GC(1) Pause Init Mark 0.567ms
# [2024-01-15T10:30:00.567+0800][info][gc] GC(1) Concurrent Marking 12.345ms
# [2024-01-15T10:30:01.001+0800][info][gc] GC(1) Pause Final Mark 0.234ms
# [2024-01-15T10:30:01.500+0800][info][gc] GC(1) Concurrent Evacuation 45.678ms
JMX监控
@Component
public class ShenandoahMonitor {
@Scheduled(fixedRate = 5000)
public void monitor() {
List<GarbageCollectorMXBean> gcBeans =
ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gcBean : gcBeans) {
if (gcBean.getName().contains("Shenandoah")) {
long count = gcBean.getCollectionCount();
long time = gcBean.getCollectionTime();
log.info("Shenandoah: Count={}, AvgPause={}ms",
count, time / Math.max(1, count));
}
}
}
}
ZGC vs Shenandoah对比
| 特性 | ZGC | Shenandoah |
|---|---|---|
| 开发者 | Oracle | Red Hat |
| 技术实现 | 染色指针+读屏障 | 转发指针+Brooks Pointer |
| 分代支持 | JDK21+ | JDK13+ |
| 暂停时间 | < 1ms | < 10ms |
| 适用平台 | 全平台 | 全平台 |
| 生态支持 | Oracle官方 | Red Hat/社区 |
性能调优
/**
* Shenandoah调优策略
*/
// 1. 减少GC触发频率
-XX:ShenandoahMinFreeThreshold=10
// 2. 加快内存归还
-XX:ShenandoahUncommitDelay=5000
// 3. 调整并发线程数
-XX:ConcGCThreads=4
// 4. 选择合适的启发式模式
-XX:ShenandoahGCHeuristics=compact // 内存紧张时使用
适用场景
/**
* 适合使用Shenandoah的场景:
* 1. 云原生应用:容器环境内存敏感
* 2. 微服务:大量小堆应用
* 3. 低延迟服务:要求稳定响应时间
* 4. 大内存应用:数十GB堆内存
*/
小结
Shenandoah通过转发指针实现并发压缩,是低延迟场景下ZGC的有力替代方案。