如何在JVM年轻时进行故障排除gc开销时间迅速增加



问题描述

有一个包含16个实例的应用程序集群。其中两个实例在执行年轻gc时花费超过1000ms,这是非常不寻常的。

通过监控面板,我们可以看到年轻的gc成本时间仍在增加。

  • gc持续时间图片:https://i.stack.imgur.com/TMejX.png
  • 两个实例之一的gc日志分析报告:[gc日志分析报告](https://gceasy.io/my-gc-report.jsp?p=YXJjaGl2ZWQvMjAyMS8wNi8yLy0tYXBpLTliOGE4NzgzLWQzOTctNGVjYy04NTEzLTdlMDI5Njc3NzMwMzQ3ZDYxODllLWI4NDAtNGVjYS05MTIxLTkyYzVmZDZjNWFmMi50eHQ=&通道=API(

一些配置信息

JVM

-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

码头集装箱

  • 8GB内存和4个CPU

我的问题

其他14个实例与两个有问题的实例具有相同的年轻gc时间开销间隔。但前者只需要不到20ms。

这是我第一次遇到这种问题,请根据您的经验给我一些故障排除建议。

Thx提前~

(一开始只是一个注释,但太长了(。1、您运行的JDK版本是什么?如果Java 8及更高版本已经过时,请离开CMS。

2,你使用了不少标志。如果您可以复制这种行为,请删除除日志记录和最大堆大小之外的所有标志,看看会发生什么。有些标志已经默认打开,您可以使用XX:+PrintCommandLineFlags进行检查
例如,根据报告,不需要元空间分配。

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

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

相关内容

最新更新