Epsilon GC(无操作 GC)
Epsilon 是 Java 11 引入的「无操作」GC。它的设计哲学是:对于某些场景,根本不需要 GC。
Epsilon 只分配内存,不回收内存。当内存耗尽时,程序直接退出(而不是尝试回收)。这种看似「极端」的设计,其实有独特的价值。
设计理念
Epsilon 的核心理念是:
如果应用的内存足够大,或者生命周期足够短,GC 的开销可能是不必要的。
工作原理
Epsilon 的实现非常简单:
- 分配内存:从堆中分配对象
- 不回收内存:没有任何垃圾回收逻辑
- 内存耗尽时:触发 OutOfMemoryError,程序退出
适用场景
短生命周期应用
对于执行时间很短的应用,Minor GC 可能还没来得及发生,应用就结束了:
内存足够的容器
如果容器内存足够大,应用的内存分配永远不会被耗尽:
性能基准测试
Epsilon 最适合用于排除 GC 干扰的性能测试:
内存敏感测试
测试应用的内存分配模式:
注意事项
内存泄漏会立即暴露
由于 Epsilon 不回收内存,任何内存泄漏都会立即导致 OOM:
不适合长生命周期应用
如果应用的运行时间足够长,最终一定会耗尽内存:
配置参数
启用 Epsilon
常用参数
与其他 GC 的对比
测试工具价值
Epsilon 是测试和诊断的有力工具:
- 测量 GC 开销:对比 Epsilon 和其他 GC 的性能差异
- 发现内存泄漏:快速暴露内存泄漏
- 验证内存分配:观察应用的真实内存需求
- 微基准测试:排除 GC 干扰的精确测量
真实案例
Netflix 的使用
Netflix 在某些性能测试中使用 Epsilon 来测量 GC 对其应用的影响。通过对比,他们发现某些高吞吐量场景下,GC 占用的时间可以忽略不计。
低延迟交易系统
某些高频交易系统在预热阶段使用 Epsilon 来测量真实的内存分配速率,为后续的 GC 调优提供数据支持。