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

如何在Java 7+中实现确定性GC暂停?,java,garbage-collection,Java,Garbage Collection,由于after不再可用,因此是否有任何方法可以实现x ms GC暂停?我正在java_8_65中尝试G1 GC,但它是不确定的,很多时候我看到年轻的GC暂停大于-XX:MaxGCPauseMillis,这是预期的,但不符合我的要求。您的选项是 进行一些调整,直到G1按预期执行 切换到您正在使用的JVM中可用的另一个收集器,例如CMS 切换到另一个JVM,它为收集器提供了更强的保证 优化应用程序以减少GC压力或最坏情况下的行为 在问题上投入更多的硬件更多或更快的CPU内核,更多的RAM 你的选择是

由于after不再可用,因此是否有任何方法可以实现x ms GC暂停?我正在java_8_65中尝试G1 GC,但它是不确定的,很多时候我看到年轻的GC暂停大于-XX:MaxGCPauseMillis,这是预期的,但不符合我的要求。

您的选项是

进行一些调整,直到G1按预期执行 切换到您正在使用的JVM中可用的另一个收集器,例如CMS 切换到另一个JVM,它为收集器提供了更强的保证 优化应用程序以减少GC压力或最坏情况下的行为 在问题上投入更多的硬件更多或更快的CPU内核,更多的RAM 你的选择是

进行一些调整,直到G1按预期执行 切换到您正在使用的JVM中可用的另一个收集器,例如CMS 切换到另一个JVM,它为收集器提供了更强的保证 优化应用程序以减少GC压力或最坏情况下的行为 在问题上投入更多的硬件更多或更快的CPU内核,更多的RAM
简单的答案是否定的。Hotspot和其他JVM(比如我为谁工作)使用的所有GC本质上都是不确定的。当然,您可以在大多数情况下调整GC以实现延迟目标,并且使用Zing将为您提供更可靠的结果,因为它与应用程序线程真正并发地执行压缩收集,因此没有停止世界暂停

问题是,如果您的应用程序突然达到一个点,即它开始以更高的速率分配对象,或者生成垃圾的速度比您调整的速度快得多,那么您将开始看到超出目标的暂停。这就是GC的工作方式


要获得像您正在寻找的那样的真正确定性行为,唯一的方法是使用查找,这也需要底层的实时操作系统。这样做的缺点通常是吞吐量会受到影响。

简单的答案是否定的。Hotspot和其他JVM(如我的工作对象)使用的所有GC本质上都是不确定的。当然,您可以在大多数情况下调整GC以实现延迟目标,并且使用Zing将为您提供更可靠的结果,因为它与应用程序线程真正并发地执行压缩收集,因此没有停止世界暂停

问题是,如果您的应用程序突然达到一个点,即它开始以更高的速率分配对象,或者生成垃圾的速度比您调整的速度快得多,那么您将开始看到超出目标的暂停。这就是GC的工作方式


要获得像您正在寻找的那样的真正确定性行为,唯一的方法是使用查找,这也需要底层的实时操作系统。这样做的缺点是通常会影响吞吐量。

还有一个选择。 据我所知,它是为实时应用程序的确定性短暂暂停而设计的。根据文档,默认值为10毫秒暂停。然而,它当然需要更多的CPU,并且更适合小堆的设计


我从未使用过它,所以我不能分享任何经验。

还有一个选择。 据我所知,它是为实时应用程序的确定性短暂暂停而设计的。根据文档,默认值为10毫秒暂停。然而,它当然需要更多的CPU,并且更适合小堆的设计


我从未使用过它,所以我不能分享任何经验。

Java 11的发行版包含一个全新的垃圾收集器,它承诺非常低的暂停时间

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


Java11的发行版包含一个全新的垃圾收集器,它承诺非常低的暂停时间

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


问题提到jrockit,因此似乎暗示不需要RTSJ级别的决定论,就像它的GCs管理的一样。问题提到jrockit,因此似乎暗示不需要RTSJ级别的决定论,与GCs管理的一样好。当前正在进行G1 gc调整,但时间不长:…不想移动到CMS,因为它将按照当前正在进行G1 gc调整,时间不长:…不想移动到CMS,因为它将按照