jvm间歇性崩溃分析

简介:

1 问题描述     

      某服务有两台机器,每隔几天会报警load高,一开始看监控发现gc时间抖动很大,以为是发生了fullgc引起卡顿而未加注意,之后登入线上机器查看日志发现是jvm崩溃导致了服务重启从而引发gc时间抖动。以某天为例,该服务分别在上午7点和上午10点发生jvm崩溃,如果同时发生崩溃将导致线上停服,后果不堪设想。

2 问题分析

     崩溃日志显示jvm崩溃发生在在标记清除扫根路径时。

     搜索此bug,发现是jvm的一个已知bug,https://bugs.openjdk.java.net/browse/JDK-8020236,这个bug在1.6和1.7中均有,只是因为重现困难而一直未被修复。

                Par_MarkFromRootsClosure::scan_oops_in_oop(HeapWord*)

 

      有人遇到和我们一样的问题(http://hllvm.group.iteye.com/group/topic/43404),他通过压测发现当“ParallelCMSThreads > ParallelGCThreads”会引起此崩溃,而当"ParallelCMSThreads <= ParallelGCThreads"时问题不再复现。而ParallelCMSThreads > ParallelGCThreads”这个问题也在jvm bug列表中(https://bugs.openjdk.java.net/browse/JDK-6668573),此bug下有人给出的解决思路是将ParallelCMSThreads 设置为 <=ParallelGCThreads。

3 解决方法

        查看我们junglepoi-service服务的jvm参数配置,发现ParallelCMSThreads被设置成4,而ParallelGCThreads却未被设置。默认情况下ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8),其中ncpus是机器的核数,由于junglepoi-service服务所在的机器为2核4G配置,因此默认情况下ParallelGCThreads=2,此时ParallelCMSThreads > ParallelGCThreads。       

       解决方法是:1)将ParallelCMSThreads设置为2或1;2)或者不设置ParallelCMSThreads,默认情况下ParallelCMSThreads = (ParallelGCThreads + 3) / 4,如果不设置默认ParallelCMSThreads=(2+3)/4=1。

       我们将ParallelCMSThreads设置为2,上线两天未复现jvm崩溃异常,后续将持续观察。

4 启示

       不能简单拷贝其它项目的jvm参数配置,需要结合项目特点、机器环境等各方面信息来综合配置。

目录
相关文章
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
2311 5
|
运维 监控 负载均衡
震惊!线上四台机器同一时间全部 OOM,到底发生了什么?
震惊!线上四台机器同一时间全部 OOM,到底发生了什么?
|
6月前
|
缓存 监控 Java
深入剖析JVM的OOM | 内存溢出如何影响JVM运行及应对策略
深入剖析JVM的OOM | 内存溢出如何影响JVM运行及应对策略
106435 1
|
6月前
|
监控 Java Linux
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
134 0
|
SQL canal 运维
JVM第六讲:线上环境 FGC 频繁,如何解决?
JVM第六讲:线上环境 FGC 频繁,如何解决?
293 0
|
Java 调度
CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?
面试过程中,场景类的问题更容易检测出一个开发人员的基本能力。这不,有一位小伙伴去阿里面试,第一面就遇到了关于“CPU 飙高系统反应慢怎么排查”的问题?当时这位小伙伴不知从何下手。 今天,我给大家分享一下我的解决思路。
175 0
|
缓存 监控 算法
案例20-内存长期占用导致系统慢
内存长期占用导致系统慢
|
算法 Java 数据处理
OOM和频繁GC预防方案
这段代码明明很简单,日常跑的都没问题,怎么一大促就卡死甚至进程挂掉?大多是因为设计时,就没针对高并发、高吞吐量case考虑过内存管理。
380 0
|
Java Linux
遇到长GC停顿、CPU满载、内存泄露、JVM崩溃等高频问题,看这里!
遇到长GC停顿、CPU满载、内存泄露、JVM崩溃等高频问题,看这里!
遇到长GC停顿、CPU满载、内存泄露、JVM崩溃等高频问题,看这里!
|
关系型数据库 Java 应用服务中间件