去年生产环境突然有一天连续发生几台服务器JVM Crash的情况。出现这种情况的时候JVM留下的error log基本相同
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00002b28192a24f0, pid=28485, tid=1088477504
#
# JRE version: 6.0_18-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (16.0-b13 mixed mode linux-amd64 )
# Problematic frame:
# V [libjvm.so+0x5c04f0]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
--------------- T H R E A D ---------------
Current thread (0x00002aab4803e800): JavaThread "CompilerThread1" daemon [_thread_in_native, id=28511, stack(0x0000000040d0d000,0x0000000040e0e000)]
siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x000000000000002c
此处略去N个字...
Current CompileTask:
C2:171% ! org.mule.esb.impl.core.provider.spring.EsbClientBean.invoke(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object; @ 56 (492 bytes)
再次略去N个字...
巧合的是crash时JVM都在做同一件事情“Current CompileTask:
C2:171% ! org.mule.esb.impl.core.provider.spring.EsbClientBean.invoke(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object; @ 56 (492 bytes)”
显示JIT在做编译优化的时候处理.EsbClientBean.invoke这个方法时出错。幸好SUN(Oracle)提供了相关的文档说明,得以让我们解决了这个问题。
文档地址:
http://www.oracle.com/technetwork/java/javase/crashes-137240.html#gbyzu
引用
If the fatal error log output shows that the Current thread is a JavaThread named CompilerThread0, CompilerThread1, or AdapterCompiler, then it is possible that you have encountered a compiler bug. In this case it might be necessary to temporarily work around the issue by switching the compiler (for example, by using the HotSpot Client VM instead of the HotSpot Server VM, or visa versa), or by excluding from compilation the method that provoked the crash. This is discussed in 4.2.1 Crash in HotSpot Compiler Thread or Compiled Code.
原文的意思简单的说:当在错误日志中显示“the Current thread is a JavaThread named CompilerThread0, CompilerThread1, or AdapterCompiler”时,可能是触发了JVM的编译器的BUG导致的。
解决办法见这里的描述
http://www.oracle.com/technetwork/java/javase/crashes-137240.html#gbyzd
主要有两类:
1.JVM使用client模式,即去掉“-server”参数改用“-client”
2.过滤掉会导致JVM crach的一些方法不执行编译优化。具体有两种做法:a.在程序的工作路径创建.hotspot_compiler文件,文件内容类似这样:
exclude org/mule/esb/impl/core/provider/spring/EsbClientBean invoke
。b.在jvm启动参数中添加启动参数
-XX:CompileCommand=exclude,org/mule/esb/impl/core/provider/spring/EsbClientBean,invoke
可以达到同样的效果。
因为第一类解决方法会整体影响应用服务器的性能,所以我们没有采用。第二类方法里我选择了b这种方式,修改启动脚本比较方便。
通过这次问题的解决,积累了一些资料可以供以后再解决此类问题。
1.一些常见的crash原因:
http://www.oracle.com/technetwork/java/javase/crashes-137240.html
2.JVM crash error log format:
http://www.oracle.com/technetwork/java/javase/felog-138657.html
分享到:
相关推荐
分析JVM崩溃日志时,重点是定位问题所在的代码行,了解触发错误的操作,以及查看是否有内存管理问题,如堆溢出或栈溢出。同时,还要检查堆栈跟踪,确定哪些线程或方法在崩溃时刻正在执行,并结合Java堆、方法区、元...
4. **源码分析**:对于开源的JVM实现,如OpenJDK,可以直接阅读源码来理解崩溃原因。 在分析日志时,我们需要关注是否有特定的错误提示,比如“OOME”(Out of Memory Error),然后根据提示检查JVM的启动参数,如...
"年轻代GC JVM crash"可能是因为在垃圾回收过程中遇到了严重问题,导致JVM崩溃。这可能是由于以下原因: 1. **内存溢出**:如果年轻代的空间不足以容纳新分配的对象,或者Survivor区无法容纳从Eden区晋升的对象,就...
2. **Java版本信息**:包含JVM的版本、实现厂商、操作系统及CPU信息,这些有助于确定问题是否与特定环境有关。 3. **堆栈跟踪**:这是分析JVM崩溃的关键部分,它列出了崩溃时每个线程的执行状态,包括方法调用栈。...
这是一个jvm crash分析工具,主要分析jvm crash的原因,以及常见的解决手段。 ## 使用方式 java -jar CrashAnalysis-1.0-SNAPSHOT.jar ${hs_err_pid.log} ${hs_err_pid.log} 是jvm crash后生成的日志。 ## 效果 ...
Crash崩溃日志
2. **堆内存分析**:堆内存是Java对象的存储区域,常见的内存泄漏和OutOfMemoryError问题都与此有关。分析堆转储可以找出哪些对象占用内存过多,以及这些对象的引用链路,从而确定是否存在内存泄漏。 3. **线程分析...
例如,在JVM crash的情况下,通常会在工作目录下自动生成一个error文件,该文件包含了crash时的详细信息,包括但不限于信号类型、错误码、问题发生的框架及堆栈信息。 在提供的案例中,可以看到JVM crash的日志信息...
- **Crash文件分析**:当JVM出现异常崩溃时,往往会生成crash文件,通过分析这些文件可以定位到问题发生的具体原因。 - **内存分析**:使用工具如MAT(Memory Analyzer Tool)、VisualVM等分析堆内存和非堆内存的...
5. **线程快照**:如果JVM在崩溃时能够生成线程快照,那么我们可以看到每个线程的状态(运行、等待、阻塞等),这对于分析死锁和其他多线程问题非常有价值。 解读JVM日志需要一定的经验和技术背景,但借助一些工具...
7. **Java性能优化**: 如果"CRaSH"与性能问题有关,那么了解Java内存模型(堆、栈、方法区等)、垃圾回收机制和性能调优工具(如VisualVM、JProfiler)是非常重要的。 8. **版本控制与协作**: 在开发过程中,版本...
2. Java 虚拟机(JVM)的故障排除:该指南提供了 JVM 故障排除的方法和步骤,包括 JVM crash 的原因分析、堆栈跟踪的获取、JVM 配置文件的编辑等。 3. Java 应用程序的故障排除:该指南介绍了 Java 应用程序的故障...
通过分析javacore文件可以获取到发生问题时刻JVM的所有线程状态、内存使用情况等关键信息,这对于诊断问题的根本原因非常有帮助,并有助于采取相应的预防措施以避免类似问题再次发生。 #### 三、javacore文件的生成...
javacore 文件及 heapdump 文件分析 javacore 文件和 heapdump 文件是 Java 应用程序在遇到致命问题时产生的两个文件,这两个文件可以帮助我们分析和解决 Java 应用程序中的问题。 javacore 文件是一个文本文件,...
Cache、Perf Data、Crash 分析方法、转储分析方法、 垃圾收集器的设计演进、CMS 和 G1 收集器、栈、JVM 对硬件寄存器的利用、栈顶缓存技术、解释器、字节 码表、转发表、Stubs、Code Cache、Code 生成器、JIT 编译器...
JVM自身可能遇到问题,如虚拟机崩溃(JVM Crash)、堆栈溢出(StackOverflowError)或配置错误。这些通常需要检查JVM配置、系统资源限制或更新JVM版本来解决。 理解和处理这些错误类型是成为熟练Java开发者的关键...
"SHELL CRaSH"可能是指一个基于Java的Shell工具或者一个与Shell脚本交互相关的项目。在这个名为"Java开发的SHELL CRaSH.gz"的压缩包中,包含的"crsh-1.1.0"可能是一个特定版本的CRaSH库,它是Java中用于创建远程...
Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器的设计演进、CMS和G1收集器、栈、JVM对硬件寄存器的利用、栈顶缓存技术、解释器、字节...