博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jvm间歇性崩溃分析
阅读量:5815 次
发布时间:2019-06-18

本文共 1071 字,大约阅读时间需要 3 分钟。

1 问题描述     

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

2 问题分析

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

     搜索此bug,发现是jvm的一个已知bug,,这个bug在1.6和1.7中均有,只是因为重现困难而一直未被修复。

                Par_MarkFromRootsClosure::scan_oops_in_oop(HeapWord*)

 

      有人遇到和我们一样的问题(),他通过压测发现当“ParallelCMSThreads > ParallelGCThreads”会引起此崩溃,而当"ParallelCMSThreads <= ParallelGCThreads"时问题不再复现。而ParallelCMSThreads > ParallelGCThreads”这个问题也在jvm bug列表中(),此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参数配置,需要结合项目特点、机器环境等各方面信息来综合配置。

转载地址:http://gpxbx.baihongyu.com/

你可能感兴趣的文章
HDU1576 A/B【扩展欧几里得算法】
查看>>
廖雪峰javascript教程学习记录
查看>>
WebApi系列~目录
查看>>
Java访问文件夹中文件的递归遍历代码Demo
查看>>
项目笔记:测试类的编写
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
如何用纯 CSS 为母亲节创作一颗像素画风格的爱心
查看>>
Linux基础命令---rmdir
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
海贼王十大悲催人物
查看>>