我经历了常规的高次要GC暂停时间(~9秒)。
该应用程序是一个用Java编写的服务器,每秒执行3次事务。
尽管没有I / O过度活动
堆参数是:
-Xms1G
-Xmx14G
-XX:+UseConcMarkSweepGC
-XX:+DisableExplicitGC
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
这种次要gc暂停时间值的可能原因是什么?
答案 0 :(得分:1)
对于类别中的问题"为什么我的GC暂停那么久?"您应该始终为GC日志提供一些代码段。
作为一种纯粹的推测,这里有一些原因可能是为什么次要GC可能异常缓慢:
-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
。