Epsilon GC是仅分配不回收的“无操作”垃圾收集器,适用于JDK11+的性能基准测试与短时任务,需配置-Xmx和-XX:+UseEpsilonGC,堆满即抛OutOfMemoryError。

Epsilon 垃圾收集器是一个“无操作”(no-op)的 GC 实现,它不执行任何内存回收,只分配对象,直到堆耗尽后直接触发 OOM(OutOfMemoryError)。它适用于短生命周期、内存可预估、且明确不需要自动回收的场景,比如性能测试基准、VM 启动开销压测、或某些函数式/一次性任务。
启用 Epsilon GC 的 JVM 参数配置
从 JDK 11 开始,Epsilon 是正式支持的 GC(JDK 8–10 中为实验性功能,需额外开启)。使用时必须显式指定,并禁用其他 GC 相关参数:
- 基本启用参数:-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC(JDK 8–10)
- JDK 11 及以上只需:-XX:+UseEpsilonGC
- 必须设置初始和最大堆大小(Epsilon 不支持动态扩容):-Xms256m -Xmx256m
- 禁止与其他 GC 参数共存(如 -XX:+UseG1GC 或 -XX:MaxGCPauseMillis),否则 JVM 启动失败
典型使用场景与注意事项
Epsilon 不是通用 GC,而是“可控失效”的工具:
- 适合微基准测试(如 JMH):排除 GC 干扰,精确测量纯代码开销
- 适合批处理脚本类应用:已知对象总量 ≤ 堆上限,运行中不产生长期存活对象
- 不能用于长时运行服务:无回收机制,堆满即终止(java.lang.OutOfMemoryError: Java heap space)
- 不会触发 Full GC、不会移动对象、不维护 GC Roots、不支持引用队列(PhantomReference 等行为未定义)
验证是否成功启用
启动时添加 -Xlog:gc*(JDK 11+)或 -XX:+PrintGCDetails(旧版),正常启用 Epsilon 后日志中会出现:
立即学习“Java免费学习笔记(深入)”;
- Using Epsilon(JDK 11+ 日志开头)
- 全程无 GC 日志输出(除非发生 OOM)
- 可通过 jstat -gc <pid> 查看,GCT 和 GCCount 始终为 0
简单示例:触发 OOM 测试
以下代码在 4MB 堆下快速耗尽内存:
public class EpsilonTest {
public static void main(String[] args) {
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // 每次分配 1MB
}
}
}启动命令:java -Xms4m -Xmx4m -XX:+UseEpsilonGC EpsilonTest 几秒内将抛出 OOM,确认 Epsilon 正常工作。


















