← 返回首页

Shenandoah垃圾回收器

📂 java ⏱ 1 min 196 words

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的有力替代方案。