设为首页 加入收藏

TOP

JVM致命错误日志详解(一)
2023-07-23 13:44:11 】 浏览:110
Tags:JVM

这篇文章是我之前总结的一篇文章,因为整理博客的原因,原有博客已经注销,但这篇文章对一些读者很有用,所以现在新瓶装旧酒重新整理回来分享给大家。

最近一段时间生产环境频繁出问题,每次都会生成一个hs_err_pid*.log文件,因为工作内容的原因,在此之前并没有了解过相关内容,趁此机会学习下,根据项目的使用情况,此文章针对JDK 8进行分析,不过因为素材问题,文章中引用的文件内容为JDK 7生成的文件,此处应该不影响,因为官方文档中关于此部分说明使用的是JDK 6生成的文件。我们将按照内容在文件中出现的顺序进行介绍。本人水平有限,工作中也没有太多机会进行此类知识的应用,文章内容主要参考官方文档,某些内容在官方文档中并没有涉及,相应的介绍也不一定准确,如果有不同看法可在评论区留言交流。

PS:本人水平有限,工作中也没有太多机会进行此类知识的应用,文章内容绝大多数来自于官方文档,某些内容在官网中并没有涉及,相应的介绍不一定准确,希望各位大佬不吝赐教

JDK 8
官方文档下载地址:https://www.oracle.com/java/technologies/javase-jdk8-doc-downloads.html
致命错误日志文档:/docs/technotes/guides/troubleshoot/felog.html#fatal_error_log_vm

JDK 7
官方文档地址:https://docs.oracle.com/javase/7/docs/
致命错误日志文档:https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/felog.html

文件描述

错误日志是在JVM遇到致命错误时生成的日志文件,可能包括以下信息:

  • 引发致命错误的异常操作或信号
  • 版本和配置信息
  • 引发致命错误的线程详细信息和线程堆栈记录
  • 正在运行的线程及其状态的列表
  • 有关堆的概要信息
  • 加载的本机库的列表
  • 命令行参数
  • 环境变量
  • 操作系统和 CPU 的详细信息

当问题严重到错误处理器无法收集并报告所有信息时,可能只有一部分信息会写入错误日志。

文件总共分为一下几个章节:

  • 简单描述崩溃信息的文件头
  • 线程描述部分
  • 进程描述部分
  • 系统信息部分

文件位置

致命错误日志文件位置可以通过 -XX:ErrorFile进行指定,例如:

java * -XX:ErrorFile=/var/log/java/java_error%p.log

以上设置表示文件会放在/var/log/java目录下,%p表示进程的PID。如果不设置XX:ErrorFile属性,日志默认生成在执行java命令的目录下,文件名默认为hs_err_pid%p.log,如果该目录因为某种情况无法写入(空间不足,权限不足等),在linux系统下默认写到/tmp目录下,windows系统下默认使用环境变量中TMP对应的目录,如果没有则使用TEMP对应的目录(TMP和TEMP均为windows默认的环境变量,且默认值一样)。

文件头

文件头在错误日志的最开头,主要是对问题的简单描述。这部分内容同样会打印到标准输出,可能也会打印到应用程序的控制台上。示例如下:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
#  SIGSEGV (0xb) at pc=0x00007f80e0cd095c, pid=48, tid=140189843019520 
# 
# JRE version: Java(TM) SE Runtime Environment (7.0_80-b15) (build 1.7.0_80-b15)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode linux-amd64 compressed oops) 
# Problematic frame: 
# V  [libjvm.so+0x65395c]  jni_SetByteArrayRegion+0x19c 
# 
# Core dump written. Default location: /apps/gateway/project/bin/core or core.48
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp 
#  

错误信息记录

前两行主要描述了信号类型、发起信号的程序计数器、进程ID和线程ID,对应关系如下所示,鉴于浏览器和手机端显示效果不一致,此处提供两种方式:

#  SIGSEGV (0xb) at pc=0x00007f80e0cd095c, pid=48, tid=140189843019520
      |      |           |                    |       |
      |      |           |                    |       +--- 线程ID
      |      |           |                    +----------- 进程ID
      |      |           +-------------------------------- 程序计数器对应的指针
      |      +-------------------------------------------- 信号值(十六进制)
      +--------------------------------------------------- 信号名称
?日志内容 实际含义
SIGSEGV 信号名称
(0xb) 信号值(十六进制)
pc=0x00007f80e0cd095c 程序计数器对应的指针
pid=48 进程ID
tid=140189843019520 线程ID

信号名称是操作系统自身的一种信息,CentOS 7下共有以下35种,可在/usr/include/bits/signum.h中查看其具体的声明

信号名称 信号值 含义
SIGHUP 1 Hangup (POSIX).
SIGINT 2 Interrupt (ANSI).
SIGQUIT 3 Quit (POSIX).
SIGILL 4 Illegal instruction (ANSI).
SIGTRAP 5 Trace trap (POSIX).
SIGABRT 6 Abort (ANSI).
SIGIOT 6 IOT trap (4.2 BSD).
SIGBUS 7 BUS error (4.2 BSD).
SIGFPE 8 Floating-point exception (ANSI).
SIGKILL 9 Kill, unblockable (POSIX).
SIGUSR1 10 User-defined signal 1 (POSIX).
SIGSEGV 11
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java中的同步和异步 下一篇FastJson转Java对像字段不区分大..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目