`
y806839048
  • 浏览: 1121083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

jvm crash 分析

    博客分类:
  • jvm
jvm 
阅读更多

今天tomcat的jvm崩了,一直jvm崩掉,每次也就看了一下内存区域,判断大概是内存问题,今天决定好好分析一下,整理了网上的一些资料。 
    
1.crash文件 
     如果有一个严重的错误引起Java进程非正常退出,我们叫Crash,这时候会产生一个日志文件。生成在工作目录下,名字为 hs_err_pidxxxx.log,可以修改配置来改变 
java -XX:ErrorFile=/var/log/java/java_error_%p.log 

 

 

其主要原因是card-marking performance optimization算法在实现的时候有瑕疵,在某些情况下会引起heap corruption。这个情况主要发生在新创建的大对象

和Eden space大小差不多,然后jvm做young GC的时候。                                         

解决方案:在启动参数中增加-XX:-ReduceInitialCardMarks将性能优化策略关闭。


2.crash头部 

Java代码  收藏代码
  1. #  
  2. # A fatal error has been detected by the Java Runtime Environment:  
  3. #  
  4. #  SIGSEGV (0xb) at pc=0xb7a0d926, pid=6028, tid=1876777888  
  5. #  
  6. # JRE version: 6.0_18-b07  
  7. # Java VM: Java HotSpot(TM) Server VM (16.0-b13 mixed mode linux-x86 )  
  8. # Problematic frame:  
  9. # V  [libjvm.so+0x5a2926]  
  10. #  
  11. # If you would like to submit a bug report, please visit:  
  12. #   http://java.sun.com/webapps/bugreport/crash.jsp  
  13. #  



   文件头中有很多有用的信息,“EXCEPTION_ACCESS_VIOLATION ”意味着Java应用Crash的时候,正在运行JVM自己的代码,而不是外部的Java代码或其他类库代码。这种情况很可能是JVM的Bug,但是也不一定。除了“EXCEPTION_ACCESS_VIOLATION ”,还有可能是别的信息,例如“SIGSEGV(0xb)”,意味着JVM正在执行本地或JNI的代码;EXCEPTION_STACK_OVERFLOW”意味着这是个栈溢出的错误。 
    另一个有用的就是 

Java代码  收藏代码
  1. # Problematic frame:  
  2. # V  [libjvm.so+0x5a2926]  



它说明Crash的时候,JVM正在从哪个库文件执行代码。除了“V”以外,还有可能是“C”、“j”、“v”、“J”。具体的表示意思如下: 

FrameType Description: 
C: Native C frame 
j: Interpreted Java frame 
V: VMframe 
v: VMgenerated stub frame 
J: Other frame types, including compiled Java frames 

3.线程部分 
  当jvm crash时在运行的线程,详细内容如下 

Java代码  收藏代码
  1. ---------------  T H R E A D  ---------------  
  2.   
  3. Current thread (0x08064800):  GCTaskThread [stack: 0x6fd55000,0x6fdd6000] [id=6038]  
  4.   
  5. siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000c  
  6.   
  7. Registers:  
  8. EAX=0x00000000, EBX=0x9f2807e8, ECX=0x00000008, EDX=0x9f280701  
  9. ESP=0x6fdd4e80, EBP=0x6fdd4ee8, ESI=0x6fdd4f38, EDI=0x00000003  
  10. EIP=0xb7a0d926, CR2=0x0000000c, EFLAGS=0x00010293  
  11.   
  12. Top of Stack: (sp=0x6fdd4e80)  
  13. 0x6fdd4e80:   c5d623b6 01064800 00000001 00000031  
  14. 0x6fdd4e90:   c5d623b7 00000400 6fdd4ed8 b79a803e  
  15. 0x6fdd4ea0:   c5d623b6 00000006 00dd4ee8 9f2807f0  
  16. 0x6fdd4eb0:   00000000 010a5cf0 6fdd4ee8 b777cd6b  
  17. 0x6fdd4ec0:   080b5e40 6fdd4f38 00000af7 00000af7  
  18. 0x6fdd4ed0:   796f1c9e 08060210 00000001 7fd26e00  
  19. 0x6fdd4ee0:   6fdd4f38 00000003 6fdd4f18 b7a0e19e  
  20. 0x6fdd4ef0:   080d5fa8 9f2807e8 00000001 6fdd4f38   
  21.   
  22. Instructions: (pc=0xb7a0d926)  
  23. 0xb7a0d916:   0f 84 3d 02 00 00 c6 45 c3 00 8b 43 04 8d 48 08  
  24. 0xb7a0d926:   8b 51 04 89 d7 c1 ff 02 85 d2 89 7d bc 0f 8e df   
  25.   
  26. Stack: [0x6fd55000,0x6fdd6000],  sp=0x6fdd4e80,  free space=1ff6fdd4814k  
  27. Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)  
  28. V  [libjvm.so+0x5a2926]  
  29. V  [libjvm.so+0x5a319e]  
  30. V  [libjvm.so+0x5a5270]  
  31. V  [libjvm.so+0x324cbb]  
  32. V  [libjvm.so+0x55de9e]  
  33. C  [libpthread.so.0+0x55cc]  



   这里指明了,当crash时,程序正在运行垃圾回收线程,所以有理由怀疑是垃圾回收出了问题,然后是一大堆的blocked的tomcat线程。此处略过 

4.内存状态部分 

Java代码  收藏代码
  1. Heap  
  2.  PSYoungGen      total 7040K, used 6912K [0x9eda00000x9f6900000xb42f0000)  
  3.   eden space 5440K, 100% used [0x9eda0000,0x9f2f0000,0x9f2f0000)  
  4.   from space 1600K, 92% used [0x9f2f0000,0x9f460000,0x9f480000)  
  5.   to   space 1600K, 91% used [0x9f500000,0x9f66c000,0x9f690000)  
  6.  PSOldGen        total 193344K, used 190843K [0x742f00000x7ffc00000x9eda0000)  
  7.   object space 193344K, 98% used [0x742f0000,0x7fd4ee08,0x7ffc0000)  
  8.  PSPermGen       total 16640K, used 16403K [0x702f00000x713300000x742f0000)  
  9.   object space 16640K, 98% used [0x702f0000,0x712f4e48,0x71330000)  



  这里可以看到,crash的时候eden space 100%使用了,有理由怀疑jvm在young gc的时候挂掉了。找了一下问题,最后在官方网站找到这个问题了 
[url]http://www.oracle.com/technetwork/java/javase/6u18-142093.html 
[/url] 
Card-Marking Optimization Issue 
A flaw in the implementation of a card-marking performance optimization in the JVM can cause heap corruption under some circumstances. This issue affects the CMS garbage collector prior to 6u18, and the CMS, G1 and Parallel Garbage Collectors in 6u18. The serial garbage collector is not affected. Applications most likely to be affected by this issue are those that allocate very large objects which would not normally fit in Eden, or those that make extensive use of JNI Critical Sections (JNI Get/Release*Critical). 

This issue will be fixed in the next Java SE 6 update. 

Meanwhile, as a workaround to the issue, users should disable this performance optimization by -XX:-ReduceInitialCardMarks. 

这段话主要三个意思:一是指这个bug影响的GC类型为1.6u18前的CMS类GC以及1.6u18的CMS、G1和并行类GC,而串行GC不受影响;二是指哪些程序会受影响,主要是那些会分配大量的大对象而eden区过小或者对JNI使用比较敏感的程序;三是指明了处理方法 
     那么此处是否符合前面的两个条件呢?通过JVM参数,我们发现本例中的GC类型未指定,也就是使用的是默认参数,那么默认的GC类型是什么呢?在JDK5.0之前默认的GC是串行GC,但是之后尤其是到了JDK6.0之后就更加智能化了,会依据机器的性能来进行指定,怎么个指定法呢?有以下三条原则: 

     1、如果你是使用服务器类JVM的话,那么就会由并行GC来取代串行GC; 
    2、当程序运行后,会首先去检查硬件环境,如果确定其性能满足服务器类机器的标准的话,就会运行服务器类JVM 
    3、什么样的机器符合服务器类的标准呢?CPU至少要在2核以上,物理内存在2G以上。 

    通过以上三条,可以确认我们服务器符合服务器类机器的标准,因此会使用并行GC,而且版本是6U18在这个bug的影响范围内。而且我们没有为这个tomcat配置内存,使用默认配置,内存比较小。 
  后续的处理方法 
  一给配置了Xms和Xmx; 
  二是使用-XX:-ReduceInitialCardMarks来解决这个bug。 
   三 是用  -XX:PermSize= 加大存放JVM加载的类型信息的内存 
   现在已经加了,先运行起来再观察。 

 

结合参考:

https://www.cnblogs.com/fubaizhaizhuren/p/4976839.html

分享到:
评论

相关推荐

    JVM crash 错误日志分析

    在Java开发过程中,JVM(Java Virtual ...总之,JVM崩溃日志分析是一个细致的过程,需要结合代码、日志和各种工具来定位问题。通过深入学习和实践,开发者可以更好地理解和处理这类问题,确保Java应用的稳定运行。

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

    分析JVM崩溃日志时,重点是定位问题所在的代码行,了解触发错误的操作,以及查看是否有内存管理问题,如堆溢出或栈溢出。同时,还要检查堆栈跟踪,确定哪些线程或方法在崩溃时刻正在执行,并结合Java堆、方法区、元...

    年轻代gc jvm crash

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

    JVM Crash,生成hs_err_pid.log文件

    标题"JVM Crash,生成hs_err_pid.log文件"指的是Java虚拟机在运行过程中遇到了致命问题,导致其终止运行,并自动生成了一个错误日志文件。这个文件通常位于JVM崩溃时的工作目录下,文件名由“hs_err_pid”和进程ID...

    hs-err-pidXXX.log 文件分析利器

    这是一个jvm crash分析工具,主要分析jvm crash的原因,以及常见的解决手段。 ## 使用方式 java -jar CrashAnalysis-1.0-SNAPSHOT.jar ${hs_err_pid.log} ${hs_err_pid.log} 是jvm crash后生成的日志。 ## 效果 ...

    java线上故障分析-线程dump,堆内存分析

    例如,在JVM crash的情况下,通常会在工作目录下自动生成一个error文件,该文件包含了crash时的详细信息,包括但不限于信号类型、错误码、问题发生的框架及堆栈信息。 在提供的案例中,可以看到JVM crash的日志信息...

    01 JVM崩块案例分析

    Crash崩溃日志

    java 虚拟机问题分析大全

    - **Crash文件分析**:当JVM出现异常崩溃时,往往会生成crash文件,通过分析这些文件可以定位到问题发生的具体原因。 - **内存分析**:使用工具如MAT(Memory Analyzer Tool)、VisualVM等分析堆内存和非堆内存的...

    crash-dump-analysis:Java Crash Dump 分析演示的示例代码

    本示例代码"crash-dump-analysis"旨在帮助开发者学习如何对Java Crash Dump进行解析和分析,以识别和修复应用中的问题。下面将详细介绍这个领域的关键知识点: 1. **Java虚拟机结构**:理解JVM的内存模型是分析崩溃...

    jvm日志解读

    5. **线程快照**:如果JVM在崩溃时能够生成线程快照,那么我们可以看到每个线程的状态(运行、等待、阻塞等),这对于分析死锁和其他多线程问题非常有价值。 解读JVM日志需要一定的经验和技术背景,但借助一些工具...

    HotSpot实战高清版本

    Cache、Perf Data、Crash 分析方法、转储分析方法、 垃圾收集器的设计演进、CMS 和 G1 收集器、栈、JVM 对硬件寄存器的利用、栈顶缓存技术、解释器、字节 码表、转发表、Stubs、Code Cache、Code 生成器、JIT 编译器...

    Java开发的SHELL CRaSH.7z

    "CRaSH"可能表示程序出现了异常,通过分析堆栈跟踪,可以找到导致问题的具体代码行。 7. **Java性能优化**: 如果"CRaSH"与性能问题有关,那么了解Java内存模型(堆、栈、方法区等)、垃圾回收机制和性能调优工具...

    JDK15-troubleshooting-guide.pdf

    2. Java 虚拟机(JVM)的故障排除:该指南提供了 JVM 故障排除的方法和步骤,包括 JVM crash 的原因分析、堆栈跟踪的获取、JVM 配置文件的编辑等。 3. Java 应用程序的故障排除:该指南介绍了 Java 应用程序的故障...

    IBM内部javacore分析pdf教程文件

    通过分析javacore文件可以获取到发生问题时刻JVM的所有线程状态、内存使用情况等关键信息,这对于诊断问题的根本原因非常有帮助,并有助于采取相应的预防措施以避免类似问题再次发生。 #### 三、javacore文件的生成...

    HotSpot实战

    Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器的设计演进、CMS和G1收集器、栈、JVM对硬件寄存器的利用、栈顶缓存技术、解释器、字节...

    javacore文件及heapdump文件分析

    在 WebSphere Application Server 中,javacore 文件可以帮助我们分析和判断一些故障,如:100% CPU Usage、Crash、Hang/Performance 问题。 需要注意的是,在某些情况下,javacore 文件可能不能正常产生,可能是...

    Java开发的SHELL CRaSH.gz

    它支持JMX(Java Management Extensions),可以与JVM管理工具集成,提供实时监控和性能分析。 2. **SSH集成**:CRaSH与SSH紧密结合,使得用户能够安全地通过SSH连接到运行中的Java应用,并执行自定义命令,进行...

    java1.8.zip

    首先,"cash"可能是笔误,正确的术语应该是“crash”,意为程序崩溃。Java应用崩溃通常与内存问题、线程死锁、错误的代码实现或不兼容的库有关。在JDK 1.8中,JVM(Java虚拟机)可能会由于以下原因出现奔溃: 1. **...

Global site tag (gtag.js) - Google Analytics