如何在Java 7+中实现确定性GC暂停?

时间:2018-06-24 19:00:23

标签: java garbage-collection

Jrockit之后不再可用,因此,有什么方法可以实现确定性(不超过x ms)GC暂停吗?我正在用java_8_65中的G1 GC进行尝试,但是它不是确定性的,很多时候我看到年轻的gc停顿大于预期的-XX:MaxGCPauseMillis,但不是我的要求。

4 个答案:

答案 0 :(得分:3)

简单的答案是否定的。 Hotspot和其他JVM(例如我为之工作的Zing from Azul)使用的所有GC本质上都是不确定的。您当然可以在大多数情况下调整GC来实现您的延迟目标,并且使用Zing会给您更可靠的结果,因为它确实与应用程序线程同时执行压缩集合(因此,没有Stop-the-世界暂停)。

问题是,如果您的应用程序突然达到了一个开始以更高的速率分配对象或生成垃圾的速度超过您所希望的速度的点,您将开始看到超出目标的暂停。这只是GC的工作方式。

获得真正确定性行为的唯一方法就是使用real-time JVM(查找RTSJ spec),这也需要底层实时操作系统。这样做的缺点是吞吐量通常会受到影响。

答案 1 :(得分:1)

您的选择是

  • 进行一些调整,直到G1达到预期效果
  • 切换到您正在使用的JVM中可用的另一个收集器,例如CMS
  • 切换到另一个JVM,为收集器提供更有力的保证
  • 优化您的应用程序以降低GC压力或最坏情况的行为
  • 在问题上投入更多的硬件(更多或更快的CPU内核,更多的RAM)

答案 2 :(得分:1)

Java 11发行版包含一个全新的垃圾收集器ZGC,保证了极短的暂停时间。

  

该项目的目标是创建一个可扩展的低延迟垃圾收集器,该垃圾收集器能够处理大小从几GB到几TB的堆,并且GC暂停时间不超过10ms。

答案 3 :(得分:0)

另一个选项可以是OpenJ9 Metronome GC。 据我所知,它是为实时应用确定性,短暂的停顿而设计的。根据文档,默认值为10毫秒的暂停。但是,它当然需要更多的CPU,并且是针对小堆的更多设计。

我从没使用过,所以我无法分享任何经验。