较小的GC暂停时间太高了。可能的原因?

时间:2017-06-23 13:47:15

标签: java garbage-collection

我经历了常规的高次要GC暂停时间(~9秒)。

该应用程序是一个用Java编写的服务器,每秒执行3次事务。

enter image description here

尽管没有I / O过度活动

enter image description here

堆参数是:

-Xms1G
-Xmx14G
-XX:+UseConcMarkSweepGC
-XX:+DisableExplicitGC
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails

这种次要gc暂停时间值的可能原因是什么?

3 个答案:

答案 0 :(得分:1)

对于类别中的问题"为什么我的GC暂停那么久?"您应该始终为GC日志提供一些代码段。

作为一种纯粹的推测,这里有一些原因可能是为什么次要GC可能异常缓慢:

  • JVM被OS暂停执行(e.i.CPU饥饿,交换,虚拟服务器冻结)
  • putty JVM在safepoint存在一些问题(虽然不太可能看到你的暂停模式)
  • 对象生存高峰
  • 参考对象处理开销(您需要添加-XX:+PrintReferebceGC以将参考处理信息输入GC日志)

答案 1 :(得分:1)

正如另一个答案所说,没有GC日志片段,它无法明确回答这个问题。有些事情要考虑:

假设没有来自底层操作系统的影响(调度,CPU抖动),次要收集所花费的时间将与年轻一代的实时数据量成比例。当收集器运行时(年轻一代中的每个活动对象在次要GC期间被复制)。看看你的老一代的图表。您看到持续增长,这表明您在次要GC期间推广了大量数据。您要么创建了许多长期存在的对象,要么不必要地维护引用。

为了减少暂停,您可以尝试减小Eden空间的大小(因此在每个次要GC上复制的潜在数据较少),并且还会降低时效阈值,以便更快地将对象移出幸存者空间。这样做的缺点是您的次要GC将更频繁地发生,因此您可能会看到吞吐量下降。

我也会更改-Xms值。在堆中显然需要超过1Gb,因此最好将其设置为14Gb,以避免在数据量增加时JVM必须调整堆大小。

答案 2 :(得分:1)

尝试使用

-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 

这将尝试将最大GC暂停时间保持在1秒以下。

您需要使用-Xmx分配足够的内存,并根据需要设置MaxGCPauseMillis

相关问题