`
ginge
  • 浏览: 211931 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

追查JVM崩溃

阅读更多

 

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,fromto区都有一个不小的数值,这个说明这个时刻处于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线程要标志活的根对象的代码时,退出了。但是我们不知道它具体在做什么。

 

CMSGC的过程:

1)  挂起JVM,这个过程非常短暂,标志所有的从全局变量,堆栈和寄存器可以访问到的对象,这些对象将作为根对象。

2)  恢复JVM的执行后,进行并行多CPU的标志被根对象间接引用到的对象,这个过程不能保证最后得到的结果是正确的,因为同时还有可能有创建新对象或者更新了Java引用了。这些变化同时也被记录下来了。

3)  如果最终可被标志的对象不超过98%,那么再次挂起JVM做最后一次标志。从根对象开始,根据2)记录的变化再次标志。这样就保证不会有对象漏掉了。

4)  恢复JVM,做扫除,把无法访问到对象占用有内存回收。

还有可能做内存整理,把空的内存统一到一块。

 

到了这里,应该可以确定十成九是JVM自身的BUG引起的了。除了自己要尝试升级JDK,还有就是向SUNBUG了。

 

 

参考:

http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/felog.html

0
0
分享到:
评论
4 楼 gogole_09 2010-09-06  
好,很好,见到这篇文章更好!
3 楼 ginge 2010-03-21  
更新一下目前状况:
在JDK 6U18 还没出来前,我从https://jdk6.dev.java.net/留意到6U18 b05修复了一个严重的GC Bug,可是大家都没办法完全确定这个是否可以解决我们的问题。于是申请在线上做并行的测试,批准的是做6u17的。不过偷偷加入了6U18,这样测试了两周,结果是6U17挂了N次,6U18都没有挂过一次!

后来刚好6u18最终可以从SUN的正式渠道下载了,它是B07版本。看了它的RELEASE NOTE,发现它里面对于GC的更新非常重大,于是又把它加入进来测试。结果也比较稳定。


最后我们把线上的机器全部更换过来,现在中文站没有挂机器的情况出现了。

这次的升级是比较运气的,没有找到根本原因,通过升级JDK解决了问题。不过有些中文站以外的机器的崩溃升级没有解决问题,最终定位到Velocity的BUG导致。

这也说明JVM的崩溃一方面有可能是JDK本身的原因造成,另一方面也会因程序或者第三方组件造成。
2 楼 ginge 2009-12-31  
目前掌握的信息不能不让我得到这样的分析结果……或者还有其他真正因素或者数据有待发掘
1 楼 laurence_cao 2009-12-31  
追踪精神可嘉,分析结果未必正确!

相关推荐

    jvm crash的崩溃日志详细分析及注意点

    另一个重要的参数是`-XX:OnError`,它允许我们在JVM崩溃时执行自定义的命令,比如`pmap %p`用于显示进程的内存映射,或者`gcore %p; dbx - %p`用于生成核心转储并启动调试器。在Linux中,这些命令会在子进程中执行,...

    JVM崩溃

    标题中的“JVM崩溃”指的是Java虚拟机(Java Virtual Machine)在运行过程中遇到了无法处理的错误,导致程序异常终止的现象。这通常是由于内存溢出、类装载错误、线程死锁或其他严重问题引起的。理解JVM崩溃的原因和...

    sigar-amd64-winnt.dll,修复jvm崩溃版本

    此为修复版本,下载后直接使用即可 版本号:1.6.4,大家去下载jar的时候别搞错了!

    基于Java平台的JVM崩溃分析工具设计源码

    该项目是一款基于Java平台的JVM崩溃分析工具源码,包含22个文件,其中19个为Java源文件,1个JAR包文件,1个Markdown文件和1个XML文件。该工具专注于分析JVM崩溃原因并提供常见解决方案。

    sigar1.6.4,jvm崩溃修复版

    在"sigar1.6.4,jvm崩溃修复版"中,它特别针对JVM崩溃问题进行了优化和修复,提升了其在Java环境下的稳定性。 在JVM(Java Virtual Machine)中,崩溃可能由于多种原因,如内存溢出、线程死锁、非法指令或系统资源...

    关于编写Java程序让Jvm崩溃

    在书上看到一个作者提出一个问题“怎样通过编写Java代码让Jvm崩溃”,我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 public class Crash { 4 public static void main...

    JVM crash 错误日志分析

    首先,我们需要了解JVM崩溃的常见原因。这可能包括内存溢出(Out of Memory Error)、线程死锁、非法指令、系统资源耗尽等。错误日志通常会提供以下几个关键部分的信息: 1. **头部信息**:包含崩溃时JVM的版本、...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

    年轻代gc jvm crash

    "年轻代GC JVM crash"可能是因为在垃圾回收过程中遇到了严重问题,导致JVM崩溃。这可能是由于以下原因: 1. **内存溢出**:如果年轻代的空间不足以容纳新分配的对象,或者Survivor区无法容纳从Eden区晋升的对象,就...

    jvm-mon基于控制台的JVM监视

    JVM监视能够帮助开发者识别内存泄漏、CPU过度使用、线程阻塞等问题,这些都可能导致应用性能下降甚至崩溃。通过实时监控,开发者可以快速定位问题,及时优化代码,提高应用的稳定性和效率。 ### jvm-mon的主要功能 ...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    CrashAnalysis-master.zip

    《深入解析JVM崩溃分析与解决方案》 在Java开发领域,JVM(Java Virtual Machine)是执行Java程序的核心。然而,由于各种原因,JVM可能会出现崩溃,这将导致应用程序无法正常运行。"CrashAnalysis-master.zip"是一...

    jvm 详细介绍,了解jvm各个组成部分和功能

    ### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...

    SAP JVM 8.1 64 bits

    SAP JVM 8.1 64位是一个专为SAP系统设计的Java虚拟机,它基于Oracle的Java Development Kit (JDK) 进行优化,以满足SAP应用程序的特定需求。SAP JVM旨在提高性能、可靠性和安全性,同时确保与SAP产品的无缝集成。...

    JVM Crash,生成hs_err_pid.log文件

    这个文件对于开发者来说至关重要,因为它记录了JVM崩溃时的详细信息,包括堆栈跟踪、系统属性、线程信息以及可能的故障原因。 标题"JVM Crash,生成hs_err_pid.log文件"指的是Java虚拟机在运行过程中遇到了致命问题...

    JVM中文指令手册.pdf

    JVM(Java Virtual Machine,Java虚拟机)是运行所有Java程序的假想计算机,是Java程序的运行环境,负责执行指令、管理数据、内存、寄存器等,是实现Java跨平台特性的关键部分。JVM指令手册详细记录了JVM的所有操作...

    jvm视频及笔记

    Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释和执行字节码,为开发者提供了跨平台的运行环境。"jvm视频及笔记"这个资源显然是一份全面学习JVM的材料,结合了视频教程和书面笔记,帮助学习者深入理解JVM的...

Global site tag (gtag.js) - Google Analytics