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中均有,只是因为重现困难而一直未被修复。

有人遇到和我们一样的问题(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参数配置,需要结合项目特点、机器环境等各方面信息来综合配置。

时间: 2024-07-29 16:58:17

jvm间歇性崩溃分析的相关文章

jvm运行时分析

官方手册: http://docs.oracle.com/javase/7/docs/     ----> http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html   java命令的各种选项的说明 参考书籍: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> 首先说下JVM的内存堆结构,看下图: 主要由 方法区Permanent Generation + 新生代Eden + 新生代幸存区S

JVM源码分析之堆外内存完全解读

概述 广义的堆外内存 说到堆外内存,那大家肯定想到堆内内存,这也是我们大家接触最多的,我们在jvm参数里通常设置-Xmx来指定我们的堆的最大值,不过这还不是我们理解的Java堆,-Xmx的值是新生代和老生代的和的最大值,我们在jvm参数里通常还会加一个参数-XX:MaxPermSize来指定持久代的最大值,那么我们认识的Java堆的最大值其实是-Xmx和-XX:MaxPermSize的总和,在分代算法下,新生代,老生代和持久代是连续的虚拟地址,因为它们是一起分配的,那么剩下的都可以认为是堆外内存

windows客户端崩溃分析和调试

本文介绍windows上崩溃分析的一些手段,顺便提多进程调试.死锁等. 1.崩溃分析过程 1.1 确认错误码 无论是用windbg还是用vs,首先应该注意的是错误码,而90%以上的崩溃都是非法访问. 在非法访问时,可以看一下访问的目标地址.地址是0,或者离0很近(0x00000008或0xfffffffc), 一般和空指针相关.如果是一个貌似正常的地址,一般是对象已析构后访问其数据,或者堆破坏. 1.2确认崩溃对应的C++操作 什么是确认崩溃对应的C++操作: 比如非法访问,通常得有个mov指令

iOS 崩溃分析

崩溃统计分析,在APP中是非常常见一种优化APP,发现APP的BUG的方式. 1.异常处理 可通过try catch 方式处理,如果发生异常,会走catch ,最终走fianlly.对一些我们不想他崩溃的地方,可以采取这种方式去处理.但要注意的是,通过这种处理,使用的第三方崩溃将捕捉不到异常信息,不会上报. @try { <#Code that can potentially throw an exception#> } @catch (NSException *exception) { &l

预防用户流失哪家强?Testin崩溃分析秒杀Flurry

预防用户流失哪家强?Testin崩溃分析秒杀Flurry 2014/11/28 · Testin · 独家评测 大家都知道,每款App或多或少都会存在质量隐患,这是开发者无法避免的问题,但是,你却可以利用开发工具将隐患对用户的影响降低到最低.当用户面对 Bug 频出的 App 又无法直接找到开发者时,他们只能去应用商店里留下差评,再到社交网络里咆哮一番.而这些因为APP质量问题造成的用户流失本是可以避免的. 让我们看看用户流失最常见原因是什么? 对开发者来说,移动App崩溃是最常见的Bug ,这

JVM 内存问题分析方法记录

1.GC日志分析 除了CMS的日志和其他GC的日志差别较大外,它们都可以抽象成如下格式 [GC [<collector>:<starting occupancy1>-><ending occupancy1>(total size1), <pause time1> secs] <starting occupancy2>-><ending occupancy2>(total size2), <pause time2>

windowsclient崩溃分析和调试

本文介绍windows上崩溃分析的一些手段,顺便提多进程调试.死锁等. 1.崩溃分析过程 1.1 确认错误码 不管是用windbg还是用vs.首先应该注意的是错误码,而90%以上的崩溃都是非法訪问. 在非法訪问时.能够看一下訪问的目标地址. 地址是0,或者离0非常近(0x00000008或0xfffffffc). 一般和空指针相关.假设是一个貌似正常的地址,通常是对象已析构后訪问其数据,或者堆破坏. 1.2确认崩溃相应的C++操作 什么是确认崩溃相应的C++操作: 比方非法訪问,通常得有个mov

系统崩溃分析

平台:MT55 F3700 现象:压测发现部分死机问题,遥控器无法待机,但主页.上下左右OK等按键仍起作用,无法播放视频,各信源下黑屏无法播放图像 关键log: 2014-06-28 14:50:45┇01-01 08:56:56.605   853  1005 F libc    : Fatal signal 11 (SIGSEGV) at 0x00000558 (code=1) 2014-06-28 14:50:45┇01-01 08:56:56.672   985  1266 I Acti

JVM源码分析之警惕存在内存泄漏风险的FinalReference(增强版)

概述 JAVA对象引用体系除了强引用之外,出于对性能.可扩展性等方面考虑还特地实现了四种其他引用:SoftReference.WeakReference.PhantomReference.FinalReference,本文主要想讲的是FinalReference,因为我们在使用内存分析工具比如mat等在分析一些oom的heap的时候,经常能看到 java.lang.ref.Finalizer占用的内存大小远远排在前面(其实通过jmap -histo就能发现,如下图所示),而这个类占用的内存大小又