JDK升级到1.6后,服务器集群经常崩溃,后来把VM的参数调整为如下:
-Xmx2g -Xms2g -Xmn512m -XX:PermSize=196m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70
|
指明了最大内存是2G,新生代为512M,年老区196M,内存占用率在达到70%的时候要执行GC,同时要使用CMS方式收集。
在增加内存后还是经常挂掉,又不知道具体由什么原因引起,很苦恼。后来就收集fatal log,经过统计,超过90%都是由于同一个因素引起。
JVM退出时的错误日志hs_err*.log通常是:
# An unexpected error has been detected by Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00002ad49843ae5d, pid=986, tid=1102739776
#
# Java VM: Java HotSpot(TM) 64-Bit Server VM (11.0-b16 mixed mode linux-amd64)
# Problematic frame:
# V [libjvm.so+0x25ee5d]
…
Heap
par new generation total 471872K, used 166068K [0x00002aaaae200000, 0x00002aaace200000, 0x00002aaace200000)
eden space 419456K, 33% used [0x00002aaaae200000, 0x00002aaab6bbd590, 0x00002aaac7ba0000)
from space 52416K, 48% used [0x00002aaac7ba0000, 0x00002aaac9442200, 0x00002aaacaed0000)
to space 52416K, 0% used [0x00002aaacaed0000, 0x00002aaacaed0000, 0x00002aaace200000)
concurrent mark-sweep generation total 1572864K, used 1105061K [0x00002aaace200000, 0x00002aab2e200000, 0x00002aab2e200000)
concurrent-mark-sweep perm gen total 200704K, used 124029K [0x00002aab2e200000, 0x00002aab3a600000, 0x00002aab3a600000)
|
可以看到年老区占用率刚好是1103473/1572864=70%,这个时刻,eden,from和to区都有一个不小的数值,这个说明这个时刻处于GC开始的阶段。后来把libjvm.so反汇编后,得到引起崩溃的执行代码,印证了这个想法。
V [libjvm.so+0x25ee5d]: 41 ff 95 50 02 00 00 callq *0x250(%r13)
V [libjvm.so+0x25ec73]: e9 7b ff ff ff jmpq 25ebf3 <_ZN24Par_MarkFromRootsClosure6do_bitEm+0x23>
V [libjvm.so+0x1cee10]: 49 8b 16 mov (%r14),%rdx
V [libjvm.so+0x256209]: e9 d2 fd ff ff jmpq 255fe0 <_ZN18CMSConcMarkingTask16do_scan_and_markEiP24CompactibleFreeListSpace+0x60>
V [libjvm.so+0x255d19]: 4c 89 ef mov %r13,%rdi
V [libjvm.so+0x611f57]: 80 7d a8 01 cmpb $0x1,-0x58(%rbp)
V [libjvm.so+0x60f5d4]: 48 8b 5d f8 mov -0x8(%rbp),%rbx
V [libjvm.so+0x4e2f6a]: e9 63 ff ff ff jmpq 4e2ed2 <_Z10java_startP6Thread+0xb2>
|
看得出,在GC线程要标志活的根对象的代码时,退出了。但是我们不知道它具体在做什么。
CMS做GC的过程:
1) 挂起JVM,这个过程非常短暂,标志所有的从全局变量,堆栈和寄存器可以访问到的对象,这些对象将作为根对象。
2) 恢复JVM的执行后,进行并行多CPU的标志被根对象间接引用到的对象,这个过程不能保证最后得到的结果是正确的,因为同时还有可能有创建新对象或者更新了Java引用了。这些变化同时也被记录下来了。
3) 如果最终可被标志的对象不超过98%,那么再次挂起JVM做最后一次标志。从根对象开始,根据2)记录的变化再次标志。这样就保证不会有对象漏掉了。
4) 恢复JVM,做扫除,把无法访问到对象占用有内存回收。
还有可能做内存整理,把空的内存统一到一块。
到了这里,应该可以确定十成九是JVM自身的BUG引起的了。除了自己要尝试升级JDK,还有就是向SUN提BUG了。
参考:
http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/felog.html
分享到:
相关推荐
本篇文章主要介绍了jvm crash的崩溃日志详细分析及注意点。具有很好的参考价值,下面跟着小编一起来看下吧
此为修复版本,下载后直接使用即可 版本号:1.6.4,大家去下载jar的时候别搞错了!
NULL 博文链接:https://zybing.iteye.com/blog/1575265
sigar1.6.4,jvm崩溃修复版,包含jar和各平台的dll,so等文件
在书上看到一个作者提出一个问题“怎样通过编写Java代码让Jvm崩溃”,我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 public class Crash { 4 public static void main...
jvm源码
jvm 配置jvm参数 配置jvm参数
jvm源码,jvm-native的源码,jvm支行机制,可对jvm的运行过程进行分析 个人网站:https://www.zhangjunbk.com
深入解析jvm深入解析jvm深入解析jvm深入解析jvm深入解析jvm深入解析jvm
JVM图解-JVM指令-JVM原型图.rar
46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT...
jvm
主要是JVM内存分配及简单的JVM性能调优
学习关于JVM基础,java内模型的全面透析,Jar hell问题以及解决办法,Class文件格式 • Java编译执行流程 • ClassFile的格式介绍 • ClassFile中FieldInfo和MethodInfo介绍 • 类型描述Descriptor介绍 • ClassFile...
首先讲述JVM的基本概念和原理、架构等。最后一HelloApp讲述JVM的工作过程
Jvm入门,Jvm入门,Jvm入门,Jvm入门,Jvm入门,Jvm入门
JVM配置资料JVM配置资料JVM配置资料JVM配置资料
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...
JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...