Java垃圾回收优化:最大暂停时间目标

3

来自Oracle 文档

最大暂停时间目标

暂停时间是垃圾收集器停止应用程序并回收不再使用的空间的持续时间。最大暂停时间目标的意图是限制这些暂停中的最长时间。垃圾收集器维护了平均暂停时间和该平均值的方差。平均值从执行开始计算,但会加权以使最近的暂停时间更具影响力。

如果平均暂停时间加上暂停时间的方差大于最大暂停时间目标,则垃圾收集器认为目标没有被满足。

垃圾收集器将调整Java堆大小和与垃圾回收相关的其他参数,以试图使垃圾回收暂停在毫秒范围内。默认情况下,没有最大暂停时间目标。这些调整可能导致垃圾收集器更频繁地发生,从而降低应用程序的总吞吐量。垃圾收集器在尝试达到任何暂停时间目标之前尝试满足吞吐量目标。然而,在某些情况下,无法满足期望的暂停时间目标。

对于CMS算法,如果最大暂停时间目标未被满足,会导致Excessive GC Time和OutOfMemoryError。

如果无法达到最大暂停时间目标,将会发生什么?是否忽略违规行为并继续执行,就像已满足目标一样?还是会抛出异常,例如CMS抛出OutOfMemory?

1个回答

1
在Java 8的GC Ergonomic文档中,它说:
“这被解释为暗示垃圾收集器希望暂停时间小于或等于指定时间。”
目标只是一个提示,不是硬性要求。
如果垃圾收集器无法达到目标,它将继续运行。正如同一文档所说:
“随着垃圾收集器尝试满足竞争目标,堆大小会发生振荡。即使应用程序已经达到稳定状态,这也是真实的。实现吞吐量目标(可能需要更大的堆)的压力与实现最大暂停时间和最小占用空间的目标(两者都可能需要较小的堆)相互竞争。”
这与我的经验相符。我从未听说过由于未达到此目标而导致错误的OOME或类似错误消息。

虽然有一些硬性要求,例如最大堆大小和过度垃圾回收时间限制。如果这些限制被违反,将导致 OOME。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接