来自oracle documentaiton
最长暂停时间目标
暂停时间是垃圾收集器停止应用程序并恢复不再使用的空间的持续时间。最大暂停时间目标的意图是限制这些暂停的最长时间。垃圾收集器维持平均停顿时间和平均时差。平均值是从执行开始时获得的,但是经过加权,以便更近期的暂停次数更多。
如果平均加上暂停时间的方差大于最大暂停时间目标,那么垃圾收集器会认为目标没有达到。
垃圾收集器将调整Java堆大小以及与垃圾收集相关的其他参数,以尝试使垃圾收集暂停时间短于毫秒。默认情况下,没有最大暂停时间目标。这些调整可能会导致垃圾收集器更频繁地发生,从而降低了应用程序的总体吞吐量。垃圾收集器尝试在吞吐量目标之前满足任何暂停时间目标。但是,在某些情况下,无法满足所需的暂停时间目标。
对于CMS算法,过多GC时间和OutOfMemoryError。
如果最长停留时间未达到目标会怎样?它是否忽略违规并继续,因为它已达到目标?或抛出一些异常,例如CMS抛出OutOfMemory?
答案 0 :(得分:1)
在Java 8 GC Ergonomic文档中,它说:
“这被解释为垃圾收集器的提示,暂停时间为毫秒或更短 。”
目标只是提示,而不是硬性要求。
如果GC无法达到目标,它就会继续。正如the same document所说:
“当垃圾收集器试图满足竞争目标时,堆的大小通常会振荡。即使应用程序达到稳定状态也是如此。实现吞吐量目标的压力(可能需要更大的堆)与目标竞争最大暂停时间和最小占用空间(两者都可能需要一小堆)。“
这符合我的经验。我从来没有听说过OOME或者类似的消息说错误是由于这个目标没有得到满足。
(某些其他事情是硬性要求;例如最大堆大小和过多的GC时间限制。如果违反了这些限制将导致OOME。)