jvm间歇性崩溃分析
http://www.cnblogs.com/LBSer/p/4417148.html
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参数配置,需要结合项目特点、机器环境等各方面信息来综合配置。
jvm间歇性崩溃分析的更多相关文章
- jvm内存溢出分析
概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...
- JVM内存问题分析
JVM运行时数据区: 1.方法区:类信息(类名,访问修饰符.字段描述.方法 描述等).常量.静态变量.即时编译后的class文件等.在GC时用永久代来实现方法区 2.运行时常量池:是方法区的一部分,存 ...
- JVM源码分析之SystemGC完全解读
JVM源码分析之SystemGC完全解读 概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可 ...
- JVM源码分析之一个Java进程究竟能创建多少线程
JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...
- iOS 崩溃分析
崩溃统计分析,在APP中是非常常见一种优化APP,发现APP的BUG的方式. 1.异常处理 可通过try catch 方式处理,如果发生异常,会走catch ,最终走fianlly.对一些我们不想他崩 ...
- Java虚拟机性能管理神器 - VisualVM(1) 简介 - JVM轻量级监控分析神器
目录(?)[-] 一VisualVM是什么 二如何获取VisualVM 三获取那个版本 四VisualVM能做什么 显示JAVA应用程序配置和运行时环境 显示本地和远程JAVA应用程序运行状态 监控应 ...
- JVM源码分析之堆外内存完全解读
JVM源码分析之堆外内存完全解读 寒泉子 2016-01-15 17:26:16 浏览6837 评论0 阿里技术协会 摘要: 概述 广义的堆外内存 说到堆外内存,那大家肯定想到堆内内存,这也是我们 ...
- JVM源码分析之Metaspace解密
概述 metaspace,顾名思义,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm,这块空间很有自己的特点,前段时间公司这块的问题太多了,主要是因为升级了中间件所 ...
- windowsclient崩溃分析和调试
本文介绍windows上崩溃分析的一些手段,顺便提多进程调试.死锁等. 1.崩溃分析过程 1.1 确认错误码 不管是用windbg还是用vs.首先应该注意的是错误码,而90%以上的崩溃都是非法訪问. ...
随机推荐
- hdu 5038 求出现次数最多的grade
http://acm.hdu.edu.cn/showproblem.php?pid=5038 模拟水题 求出现次数最多的grade.如果有多个grade出现的次数一样多,且还有其他的grade,则把这 ...
- Hibernate多对多双向关联需要注意的问题(实例说话)
以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 持久化类Student: package bean; import java.util.Set; publi ...
- PHP环境的搭建及与nginx的集成
1. 去php官网下载最新稳定版(最新其实是7.0,为了兼容性,使用5.6.16) wget http://cn2.php.net/get/php-5.6.16.tar.gz/from/this/m ...
- Android Studio Genyomtion配置
在AndroidStudio里面点击 File -> Settings 在Settings界面中,选择Plugins 在Plugins,输入Genymotion,并点击下面的链接 点击Insta ...
- [ACM_数据结构] POJ2352 [树状数组稍微变形]
Description Astronomers often examine star maps where stars are represented by points on a plane and ...
- ABP框架入门踩坑-使用MySQL
使用MySQL ABP踩坑记录-目录 起因 因为我自用的服务器只是腾讯云1核1G的学生机,不方便装SQL Server,所以转而MySQL. 这里使用的MySQL版本号为 8.0. 解决方案 删除Qi ...
- 使用filter进行登录验证,并解决多次重定向问题
最近在做关于filter登录验证的功能,防止未登录的用户直接通过地址进入系统 LoginFilter类:继承Filter接口 package com.ss.filter; import java.io ...
- sp2010 升级sp2013 用户无法打开网站
Add-PSSnapin microsoft.sharepoint.powershell $WebAppName = "http://wtcsps99:82/" $wa = get ...
- max渲染通道元素的范例
renderElementManager = MaxOps.GetCurRenderElementMgr() renderElementManager.Removeallrenderelements( ...
- log Log4NET配置
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过 日志查看系统的运行过程,从而发现系统的问题.日志的作用:将 ...