JVM致命错误日志(hs_err_pid.log)分析

JVM致命错误日志(hs_err_pid.log)分析

jvm出现致命错误时,会生成一个错误文件 hs_err_pid<pid>.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证系统稳定。当出现crash时,该文件默认会生成到工作目录下.

背景

并发线程处理PDF文件,jvm出现致命错误时,生成错误文件 hs_err_pid.log。

SIGBUS意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。

查看hs_err_pid.log日志

这里一个重要信息是SIGBUS(0x7)表示jvm crash时正在执行线程试图访问一块无文件内容对应的内存区域,比如超过文件尾的内存区域,或者以前有文件内容对应,现在为另一进程截断过的内存区域。其中SISBUS是信号名称,0x7是信号码,pc=0x00007fa4495592a0指的是程序计数器的值,pid=34372是进程号,tid=0x00007fa320cd2700是线程号。

文件下面是导致crash的线程信息和该线程栈信息,描述信息如下:

Current thread (0x00007fa348028000):  JavaThread "hlooc-task-Orders-9" daemon [_thread_in_vm, id=37394, stack(0x00007fa320bd2000,0x00007fa320cd3000)]

siginfo: si_signo: 7 (SIGBUS), si_code: 2 (BUS_ADRERR), si_addr: 0x00007fa449e29041

以上表示导致出错的线程是0x00007fa348028000(指针),线程类型是JavaThreadJavaThread表示执行的是java线程,关于该线程其它类型还可能是:

  • VMThread:jvm的内部线程
  • CompilerThread:用来调用JITing,实时编译装卸class 。 通常jvm会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,例如:CompilerThread1
  • GCTaskThread:执行gc的线程
  • WatcherThreadjvm周期性任务调度的线程,是一个单例对象。 该线程在JVM内使用得比较频繁,比如:定期的内存监控、JVM运行状况监控,还有我们经常需要去执行一些jstat 这类命令查看gc的情况
  • ConcurrentMarkSweepThreadjvm在进行CMS GC的时候,会创建一个该线程去进行GC,该线程被创建的同时会创建一个SurrogateLockerThread(简称SLT)线程并且启动它,SLT启动之后,处于等待阶段。CMST开始GC时,会发一个消息给SLT让它去获取JavaReference对象的全局锁:Lock

后面的hlooc-task-Orders-9表示线程名,daemon表示该线程为守护线程,再后面的[_thread_in_vm表示线程正在执行虚拟机代码,关于该描述其它类型还可能是:

  • _thread_in_native:线程当前状态
  • _thread_uninitialized:线程还没有创建,它只在内存原因崩溃的时候才出现
  • _thread_new:线程已经被创建,但是还没有启动
  • _thread_in_native:线程正在执行本地代码,一般这种情况很可能是本地代码有问题
  • _thread_in_vm:线程正在执行虚拟机代码
  • _thread_in_Java:线程正在执行解释或者编译后的Java代码
  • _thread_blocked:线程处于阻塞状态
  • …_trans:以_trans结尾,线程正处于要切换到其它状态的中间状态

最后的id=37394表示线程IDstack(0x00007fa320bd2000,0x00007fa320cd3000)表示栈区间。

siginfo: si_signo: 7 (SIGBUS), si_code: 2 (BUS_ADRERR), si_addr: 0x00007fa449e29041这部分是导致虚拟机终止的非预期的信号信息:其中si_signosi_codeLinux下用来鉴别异常的

日志头文件包含概要信息,简述了导致crash的原因。而导致crash的原因很多,常见的原因有jvm自身的bug,应用程序错误,jvm参数配置不当,服务器资源不足,jni调用错误,线程试图访问一块无文件内容对应的内存区域,比如超过文件尾的内存区域,或者以前有文件内容对应,现在为另一进程截断过的内存区域。

查看liunx系统日志messages

crash发生于11:26:33

查看java业务日志busi.log

11:26:33处理了两次同一个PDF文件

结论:线程JavaThread "upp-task-Orders-9"试图访问的PDF文件无文件内容对应的内存区域,并发处理有问题.

posted @ 2021-10-29 09:40  Hlooc  阅读(6813)  评论(0编辑  收藏  举报