Java 当JVM年轻gc花费的时间迅速增加时,如何进行故障排除 问题描述

Java 当JVM年轻gc花费的时间迅速增加时,如何进行故障排除 问题描述,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,有一个包含16个实例的应用程序集群。它们的两个实例在执行young gc时花费超过1000毫秒,这是非常不寻常的 通过monitor仪表板,我们可以看到年轻的gc成本时间仍在增加 gc持续时间pic: 两个实例之一的gc日志分析报告:[gc日志分析报告] () 一些配置信息 虚拟机 码头集装箱 8GB内存和4个CPU 我的问题 其他14个实例与两个有问题的实例具有相同的年轻gc时间开销间隔。但前者只需要不到20毫秒的时间 这是我第一次遇到这种问题,请根据您的经验给我一些解决问题的建议 T

有一个包含16个实例的应用程序集群。它们的两个实例在执行young gc时花费超过1000毫秒,这是非常不寻常的

通过monitor仪表板,我们可以看到年轻的gc成本时间仍在增加

  • gc持续时间pic:
  • 两个实例之一的gc日志分析报告:[gc日志分析报告] ()
一些配置信息 虚拟机 码头集装箱
  • 8GB内存和4个CPU
我的问题 其他14个实例与两个有问题的实例具有相同的年轻gc时间开销间隔。但前者只需要不到20毫秒的时间

这是我第一次遇到这种问题,请根据您的经验给我一些解决问题的建议

Thx提前~

(一开始只是一个评论,但太长了)。 1、您正在运行哪个JDK版本?如果晚了Java8或更高版本,请离开CMS

2、你使用了相当多的标志。如果可以复制该行为,请删除除日志记录和最大堆大小之外的所有标志,然后查看发生了什么。某些标志已经默认打开,您可以使用
XX:+PrintCommandLineFlags

根据报告,例如,元空间分配是不需要的

3、一般来说,当活动集很小时,gc性能最好,从图表上看,这远远不够。跟踪到旧的gen通常是昂贵的,所以这可能是gc时间长的原因之一
查看GC持续时间图,请注意,当GC之前的堆使用率达到2.5 GB时,该行为将变差。在那之前,它已经正常运行了。但500 MB的增长足以让vm进入另一种状态。你可以试着检查一下,在那个时候(6月1日上午10:30左右),你是否能看到任何奇怪的事情发生

(顺便说一句,很有趣的是y轴被标记为毫比特。这是我以前从未见过的单位)

-Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -verbose:gc -Xloggc:/data/logs/app-gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Dfile.encoding=UTF-8 -Djava.awt.headless=true -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/app.dump -XX:MaxDirectMemorySize=256m -XX:+UseCMSInitiatingOccupancyOnly -XX:+ExplicitGCInvokesConcurrent