Java 次要GC暂停时间太高。可能的原因?

Java 次要GC暂停时间太高。可能的原因?,java,garbage-collection,Java,Garbage Collection,我正在经历常规的高-小GC暂停时间(~9秒) 该应用程序是一个用Java编写的服务器,每秒钟执行3个事务 即使没有I/O过度活动 堆参数包括: -Xms1G -Xmx14G -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+PrintGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCDetails

我正在经历常规的高-小GC暂停时间(~9秒)

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

即使没有I/O过度活动

堆参数包括:

-Xms1G
-Xmx14G
-XX:+UseConcMarkSweepGC
-XX:+DisableExplicitGC
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
出现这种较小的gc暂停时间值的可能原因是什么?

对于“为什么我的gc暂停那么长?”类别中的问题,您应该始终为gc日志提供一些片段

作为纯粹的推测,以下是次要GC异常缓慢的几个原因:

  • JVM被OS暂停执行(例如CPU不足、交换、虚拟服务器冻结)
  • putty JVM存在一些问题(但不太可能查看您的暂停模式)
  • 物体生存尖峰
  • 引用对象处理开销(您需要添加
    -XX:+printferebecegc
    以将引用处理信息获取到GC日志中)
对于“为什么我的GC暂停那么长时间?”类别中的问题,您应该始终为GC日志提供一些片段

作为纯粹的推测,以下是次要GC异常缓慢的几个原因:

  • JVM被OS暂停执行(例如CPU不足、交换、虚拟服务器冻结)
  • putty JVM存在一些问题(但不太可能查看您的暂停模式)
  • 物体生存尖峰
  • 引用对象处理开销(您需要添加
    -XX:+printferebecegc
    以将引用处理信息获取到GC日志中)

正如另一个答案所说,如果没有GC日志片段,就不可能确定地回答这个问题。需要考虑的一些事情:

假设不受底层操作系统的影响(调度、CPU抖动),小规模收集所需的时间将与收集器运行时年轻一代中的实时数据量成正比(年轻一代中的每个实时对象都在小规模GC期间被复制)。看看你的老一代的图表。你看到了持续的增长,这表明你在小GC期间提升了大量的数据。您要么创建了大量长寿对象,要么维护了不必要的引用

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


我还将更改-Xms值。堆中显然需要超过1Gb,因此最好将其设置为14Gb,以避免JVM随着数据量的增加而调整堆的大小

正如另一个答案所说,如果没有GC日志片段,就不可能确定地回答这个问题。需要考虑的一些事情:

假设不受底层操作系统的影响(调度、CPU抖动),小规模收集所需的时间将与收集器运行时年轻一代中的实时数据量成正比(年轻一代中的每个实时对象都在小规模GC期间被复制)。看看你的老一代的图表。你看到了持续的增长,这表明你在小GC期间提升了大量的数据。您要么创建了大量长寿对象,要么维护了不必要的引用

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

我还将更改-Xms值。堆中显然需要超过1Gb,因此最好将其设置为14Gb,以避免JVM随着数据量的增加而调整堆的大小

尝试使用

-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 
这将尝试将最大GC暂停时间保持在1s以下

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

尝试使用

-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 
这将尝试将最大GC暂停时间保持在1s以下


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

Thx对于您的答案,由于安全原因,我无法访问GC日志,显然存在一些限制。将Xms设置为14g是我要求的第一件事。我认为abt将eden扩展到1g,因为分配的对象都是一些大的实例。我假设GC是因为分配失败而触发的,这就是为什么当70%的eden已满时会触发GC。Eden gen从未满过80%或90%!!不过,增加一些空间似乎是一个好主意,可以让分配更加顺畅。您的想法是受欢迎的。“至于GC日志,出于安全原因,我没有任何访问权限”听起来像是组织上的废话,因为GC logsThx中没有安全敏感信息供您回答,至于GC日志,出于安全原因,我没有任何访问权限,显然有一些限制。将Xms设置为14g是我要求的第一件事。我认为abt将eden扩展到1g,因为分配的对象都是一些大的实例。我假设GC是因为分配失败而触发的,这就是为什么当70%的eden已满时会触发GC。Eden gen从未满过80%或90%!!不过,增加一些空间似乎是一个好主意,可以让分配更加顺畅。欢迎您的想法。“至于GC日志,出于安全原因,我没有任何访问权限”听起来像是组织上的废话,因为GC日志中没有安全敏感信息。谢谢您的回答,先生。至于GC日志,有一些限制,我没有。谢谢你的回答,先生。至于GC日志,有一些限制,我没有任何限制。