生成
1. 生成error 文件的路径:你可以通过参数设置-XX:ErrorFile=/path/hs_error%p.log, 默认是在java运行的当前目录[default: ./hs_err_pid%p.log]
2. 参数-XX:OnError 可以在crash退出的时候执行命令,格式是-XX:OnError=“string”, <string> 可以是命令的集合,用分号做分隔符, 可以用"%p"来取到当前进程的ID.
例如:
// -XX:OnError="pmap %p" // show memory map
// -XX:OnError="gcore %p; dbx - %p" // dump core and launch debugger
在linux中系统会fork出一个子进程去执行shell的命令,因为是用fork可能会内存不够的情况,注意修改你的 /proc/sys/vm/overcommit_memory 参数,不清楚为什么这里不使用vfork
3. -XX:+ShowMessageBoxOnError 参数,当jvm crash的时候在linux里会启动gdb 去分析和调式,适合在测试环境中使用。
什么情况下不会生成error文件
linux 内核在发生OOM的时候会强制kill一些进程, 可以在/var/logs/messages中查找
Error crash 文件的几个重要部分
a. 错误信息概要
SIGSEGV 错误的信号类型
pc 就是IP/PC寄存器值也就是执行指令的代码地址
pid 就是进程id
# Problematic frame:
# V [libjvm.so+0x593045]
就是导致问题的动态链接库函数的地址
pc 和 +0x593045 指的是同一个地址,只是一个是动态的偏移地址,一个是真实运行的虚拟地址
b.信号信息
Java中在linux 中注册的信号处理函数,中间有2个参数info, ucvoid
寄存器的信息就保存在 (ucontext_t*)usVoid中
信号的详细信息,和si_addr 出错误的内存,这里对应的就是信号siginfo_t的结构体里的si_addr,内核会把导致错误的内存地址保存在用户空间的信号结构体中siginfo_t,这样在进程在注册的信号处理函数中可以拿到导致错误的地址。
c.寄存器信息
寄存器的信息就保存在处理函数参数 (ucontext_t*)usVoid中
在X86架构下:
寄存器的信息在分析出错的时候是非常重要的
打印出执行附近的部分机器码
在instruction 部分中会打印出部分的机器码
格式是
第一种使用udis库里带的udcli工具来反汇编
命令:
显示出对应的汇编
第二种可以用
查找偏移地址 0x593045, 就是当时的执行的汇编,然后结合上下文,源码猜测出问题的语句。
d.寄存器对应的内存的值
jvm 会通过寄存器的值对找对应的对象,也是一个比较好的参考
e. 其他的信息
error 里面还有一些线程信息,还有当时内存映像信息,这些都可以作为分析的部分参考
crash 报告可以大概的反应出一个当时的情况,特别是在没有core dump的时候,是比较有助于帮助分析的,但如果有core dump的话,最终还是core dump能快速准确的发现问题原因。
分享到:
相关推荐
本篇文章主要介绍了jvm crash的崩溃日志详细分析及注意点。具有很好的参考价值,下面跟着小编一起来看下吧
NULL 博文链接:https://myspace1916.iteye.com/blog/1441465
适用于jvm运行生成的gc日志文件可视化分析
JVM 输出 GC 日志导致 JVM 卡住
用java内存监控工具生成的JVM内存日志,用jmap生成的
JVM分析工具 JVM分析工具JVM分析工具JVM分析工具JVM分析工具JVM分析工具
IBM java dump 文件分析工具,分析java堆栈信息
Crash崩溃日志
(二)MATJVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.(二)MATJVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.
mat用于分析JVM的内存dump信息,是在JVM内存异常时进行内存分析的好工具
jvm内存反洗工具:
Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。
JVM运行机制深入分析,适用于研究java开发的人员,想深入理解jvm
1.jvm内存结构及功能概述 2.Jvm Heap 内存结构 3.Jvm 的内存分配
NULL 博文链接:https://lovewen-2004.iteye.com/blog/2427798
一、Jdk组成 二、Jdk32与jdk64的差异 三、自动内存管理机制 四、内存泄露与内存溢出 五、垃圾回收算法 六、虚拟机性能监控工具
在书上看到一个作者提出一个问题“怎样通过编写Java代码让Jvm崩溃”,我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 public class Crash { 4 public static void main...
MAT JVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.
JVM优化及面试热点分析
java虚拟机(JVM)调优案例分析与Eclipse性能调优实战