Epsilon GC 是 Java 11 引入的无回收垃圾收集器,专用于单元测试和内存泄漏工具开发:它禁用 GC,确保对象永驻、引用不被清理、内存增长可预测;适用于可控内存基线构建与轻量隔离测试,但需防 OOM 且 JDK 21 已移除。
Java 11 引入的 Epsilon 垃圾收集器(GC)不是用来跑生产系统的,而是专为“不回收内存”的场景设计——它在 JVM 启动后完全不触发 GC,也不管理堆内存释放。这恰恰让它成为单元测试和内存泄漏工具开发中极佳的隔离载体。
常规 GC 会带来非确定性停顿、对象提前回收、弱引用/软引用被意外清空等问题,干扰对对象生命周期、引用链、内存占用的精确观测。Epsilon 彻底关闭 GC,让所有 new 出的对象一直存活到 JVM 退出,从而保证:
开发内存泄漏分析工具(如自定义 heap dump 分析器、引用链追踪器、对象计数器)时,需要稳定、纯净的内存快照。Epsilon 提供了理想基线:
Runtime.getRuntime().gc() 无实际效果,但调用安全,适合统一初始化流程java.lang.instrument 或 java.lang.management.MemoryPoolMXBean 可精确统计每类对象实例数、总大小-XX:+PrintGCDetails(虽然 Epsilon 不打印 GC 日志,但该参数兼容)或 JFR 事件过滤,能干净地排除 GC 相关噪音,只聚焦应用层分配行为Epsilon 启动开销极低,适合高频次、短生命周期的测试进程。实际使用建议:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xmx512m(注意必须显式指定堆大小,否则默认为 0)-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dump.hprof,可在 OOM 时获取完整未回收堆镜像,用于离线分析泄漏点Epsilon 不是万能方案,需明确其边界:
-XX:+UnlockExperimentalVMOptions;JDK 21 起 Epsilon 已移除,推荐在 JDK 11–17 环境下使用