Epsilon GC - 不回收垃圾的 Java GC
提到垃圾回收器,Java 开发人员应该都不陌生。Java 虚拟机提供了不同的垃圾回收器实现。这里介绍的 Epsilon 是一个很特别的垃圾回收器,它只负责分配内存,并不回收内存。当堆内存耗尽之后,JVM 直接因为 OutOfMemory 而终止。Epsilon 在 Java 11 中加入。
一个不回收内存的 GC 实现有什么用呢?Epsilon 有自己的应用场景。
首先是那些运行时间很短的程序,比如命令行程序,定期执行的简单任务。因为这些程序的运行时间很短,在运行过程中进行垃圾回收没有意义。当程序退出之后,所占用的内存会被自动释放。
其次是对延迟和吞吐量很敏感的程序。回收垃圾的操作会带来延迟,Epsilon 完全避免了这些延迟。如果程序在运行过程中使用的堆内存有上限,可以使用 Epsilon 降低延迟和提升吞吐量。
最后是与测试相关的场景。在做应用的性能测试时,使用 Epsilon 可以从性能测试中去掉 GC 的影响,得到更准确的结果。另外一种测试与应用的内存分配上限有关。比如,如果预期应用在运行时分配的内存不会超过 1G。可以使用 Epsilon 并设置堆内存上限为 1G。如果在测试中应用分配的内存超过上限,应用会因为 OutOfMemory 退出,可以分析 heap dump 来查找原因。
启用 Epsilon 需要两个参数。UnlockExperimentalVMOptions
解锁试验性的 JVM 选项;
UseEpsilonGC
启用 Epsilon。一般还需要通过 -Xmx
来设置堆内存的上限。
比如最简单的 Hello World 程序,使用下面的命令可以启用 Epsilon。
如果把堆内存限制为 8M,使用 Epsilon 的 Hello World 程序会抛出 OutOfMemory 错误,因为所需要分配的内存超过了 8M。
使用默认的 G1,同样是 8M 的 heap,程序运行就不会有问题,因为有垃圾回收。