如何配置GC不能阻止世界?

假设我有一个JVM 1.7,它可以正常运行,最大1G。 堆大小。 并且只使用~0.5G的堆。

在某些时刻,堆使用量在几分钟内急剧增加(我怀疑负载增加而不是内存泄漏)并且GC( PS MarkSweep )启动。 GC运行约30分钟。 并且服务器没有响应所有时间。

堆统计显示,当时Old Gen堆使用量增加, Eden减少, max Survivor增加。

JVM使用默认选项-XX:+UseParallelGC

我将尝试增加堆,限制输入数据大小等。但我想知道如何调整GC以使 “停止世界”半小时。 我不介意服务器是否运行速度慢但我不想让它停止响应。

如何配置GC不能阻止世界

虽然你不能得到保证(除非你像Zing一样在VM上),你可以给GC提供软目标,它将尝试实现。 在这里查看更多。 Oracle Technetwork。 PT。 人体工程学

XX:MaxGCPauseMillis = 。这被解释为需要暂停毫秒或更短时间的提示; …请注意,这些调整可能会导致垃圾收集器降低应用程序的总吞吐量,并且在某些情况下无法满足所需的暂停时间目标。

-XX:GCTimeRatio = 。吞吐量目标是根据垃圾收集所花费的时间与垃圾收集之外所花费的时间(称为应用程序时间)来衡量的。 目标由命令行选项-XX:GCTimeRatio =指定,它将垃圾收集时间与应用程序时间的比率设置为1 /(1 +)。 例如,-XX:GCTimeRatio = 19设置目标为垃圾收集的总时间的1/20或5%。 默认值为99,导致垃圾回收的目标为1%。

PS。 但是,我有一种观点认为,如果一个拥有0.5Gb堆的应用程序在GC中花费30分钟,则应用程序出现问题的可能性更大,而不是使用GC本身,除非您尝试在某些传统平台上运行该应用程序。