java jvm-old gc耗时几十s,导致系统告警
问题
生产环境告警,接口超时。
原因
old gc耗时几十s,导致系统瞬间卡死,然后接口都超时了。
文章图片
另外一个应用也是耗时好几s,导致系统瞬间卡死,然后很多告警。
文章图片
不是每次old gc都会卡死,而是偶尔一次old gc才会耗时很久,大部分时候正常。
文章图片
本质原因
为什么old gc耗时这么久?原因是因为之前有一个节点接入skywalking,然后调整了jvm配置,具体是:新生代和老年代的比例,默认是2。现在是4,老的内存大小翻倍——导致老年代的gc阈值变高了,所以才会很久gc一次,但是有可能导致单次耗时太久。
正常节点的old gc是下面这样。
文章图片
正常节点和异常节点的jvm配置
异常节点
$ jinfo -flags 11597
Attaching to process ID 11597, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Non-default VM flags:
-XX:CICompilerCount=4 -XX:InitialHeapSize=3221225472 -XX:MaxHeapSize=3221225472
-XX:MaxMetaspaceSize=524288000
-XX:MaxNewSize=643825664
-XX:MetaspaceSize=314572800
-XX:MinHeapDeltaBytes=524288 -XX:NewRatio=4 -XX:NewSize=643825664 -XX:OldSize=2577399808 -XX:ThreadStackSize=512 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
-XX:+UseParallelGC//默认:吞吐量优先-新生代 + 多线程-老年代
Command line:-javaagent:/home/xxx/private-cloud/agent/skywalking-agent.jar -Dskywalking.agent.service_name=trade-base -Dskywalking.agent.instance_uuid=xxx -Ddubbo.application.name=xxx-base -Ddubbo.application.version=green-1
-Xmx3072m -Xms3072m
-XX:NewRatio=4//新和老的比例,默认是2。现在是4,老的内存大小翻倍——导致老年代的gc阈值变高了,所以才会很久gc一次,但是有可能导致单次耗时太久。
-Xss512k
-XX:MetaspaceSize=300m
-XX:MaxMetaspaceSize=500m
注:因为接入了skywalking,并且配置了jvm参数,所以jvm参数和正常节点不一样,本质就是因为这个原因导致的。
为什么新的配置就有问题?因为:新和老的比例,默认是2。现在是4,老的内存大小翻倍——导致老年代的gc阈值变高了,所以才会很久gc一次,但是有可能导致单次耗时太久。
注意这个只是接入了skywalking,并且由于skywalking占用资源,所以jvm内存调大,但是新老比例不应该调大。
正常节点
$ jinfo -flags 53022
Attaching to process ID 53022, please wait...
Debugger attached successfully.
Server compiler detected.
【java jvm-old gc耗时几十s,导致系统告警】JVM version is 25.161-b12
Non-default VM flags:
-XX:CICompilerCount=3
-XX:InitialHeapSize=127926272
-XX:MaxHeapSize=2046820352 -XX:MaxNewSize=682098688
-XX:MinHeapDeltaBytes=524288 -XX:NewSize=42467328 -XX:OldSize=85458944
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps
-XX:+UseParallelGC //默认垃圾回收器
Command line:-Ddubbo.application.name=xxx-base -Ddubbo.application.version=green-1
解决方法
回滚jvm配置,即把有问题的节点的Jvm配置改为和正常节点一样。
正常节点的jvm是使用默认配置,即没有配置jvm参数。
本文由博客一文多发平台 OpenWrite 发布!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- Java基础-高级特性-枚举实现状态机