探索 Java 'hs_err_pid' 文件


您是否想过当 Java 虚拟机 (JVM) 遇到严重错误并意外崩溃时会发生什么?好吧,此时 JVM 会生成一个名为“ hs_err_pid ”的神秘文件。在这篇文章中,我们将揭开这个文件的谜团。我们将深入研究它的用途,学习如何解读其内容,并探索当您的 Java 应用程序出现问题时它提供的重要信息。因此,如果您曾经对“ hs_err_pid ”文件感到困惑,或者您只是好奇如何理解它,请继续阅读以发现您需要的关键见解。

hs_err_pid文件是什么?

当 Java 虚拟机 (JVM) 遇到严重错误并崩溃时,它会以“ hs_err_pid ”文件的形式留下痕迹。该文件是一个信息金矿,包含各个级别的详细信息,例如线程、库、应用程序、资源、环境和系统。它作为崩溃时 JVM 状态的综合报告。这些细节对于诊断事故原因非常宝贵。

“ hs_err_pid ”文件在哪里创建?

当 JVM 崩溃时,“ hs_err_pid ”文件的位置确定如下:

  1. -XX:ErrorFile:如果指定了JVM 参数“ -XX:ErrorFile ”,则将在此参数指定的路径中创建“ hs_err_pid ”文件。
  2. 工作目录:如果未使用“ -XX:ErrorFile ”参数,JVM 会在 Java 应用程序的工作目录中生成“ hs_err_pid ”文件。
  3. 临时目录:如果由于某种原因无法在工作目录中创建文件(例如,由于空间不足、权限问题或其他限制),JVM 将在由 指定的临时目录中创建“ hs_err_pid ”文件操作系统。

如何读取“ hs_err_pid ”文件?

hs_err_pid ”文件是纯文本文档,虽然可以通过使用标准文本编辑器打开它来访问和检查其内容,但由于其技术性质,解释文件中的原始数据可能是一项具有挑战性的任务。在许多情况下,解密原始格式的文件可能非常复杂且耗时。

为了简化流程并使信息更易于访问,许多开发人员选择使用fastThread等专用工具。该工具旨在解析“ hs_err_pid ”文件,并以更具可读性和组织性的格式呈现数据,并附有图表和指标。

如何分析' hs_err_pid '文件?

图:fastThread工具分析hs_err_pid文件

图: fastThread 工具分析hs_err_pid文件

您可以使用 fastThread 工具分析“ hs_err_pid”文件。

  1. 登录fastThread
  2. 上传hs_err_pid文件
  3. 单击分析按钮

完成这些步骤后,fastThread 将立即生成一份综合报告。本报告旨在为您提供丰富的信息。它包含多个部分,可帮助您深入了解 JVM 问题。继续阅读这篇文章以了解这些部分。

JVM信息

图:JVM版本信息

图:JVM版本信息

报告的第一部分专门提供有关 Java 虚拟机 (JVM) 的关键详细信息。它包括:

  • JRE 版本:此部分显示 JVM 崩溃时使用的 Java 运行时环境 (JRE) 版本。
  • 崩溃时间:您将找到 JVM 遇到严重错误并崩溃时的准确日期和时间。
  • 经过的时间:这个有价值的指标表明 JVM 在崩溃发生之前运行了多长时间。

崩溃原因

图:JVM 崩溃的高级原因

图:JVM 崩溃的高级原因

在本节中,您将找到导致 JVM 崩溃的高级原因。常见的崩溃原因包括:

  • SIGSEGV
  • SIGBUS
  • EXCEPTION_ACCESS_VIOLATION
  • EXCEPTION_STACK_OVERFLOW
  • Out of Memory Error

有关这些原因的解释,您可以参考此Oracle 文档

堆大小

图:JVM 内存区域利用率

图:JVM 内存区域利用率

本节提供 JVM 内部内存区域的分配和消耗内存的详细信息:

  1. 年轻一代
  2. 老一代
  3. 元空间

了解这些内存区域的分配和使用大小对于诊断与内存消耗相关的问题至关重要。在内存泄漏的情况下,您可能会观察到已用大小接近其最大容量。

执行的代码/库

在本节中,您将找到发生崩溃时 JVM 正在执行的确切代码行或库。以下是一些示例:

代码行

  • # J 11538 C2 com.buggyapp.StoryContentPushProcessor.scribeUpsert(Lcom/espn/cricket/data/domain/StoryType;Ljava/nio/file/Path;)V (224 bytes) @ 0x0000000002629d49 [0x0000000002626ce0+0x3069]
  • # J 17883 c2 java.util.concurrent.ConcurrentSkipListMap.doPut(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object; java.base@10.0.2 (548 bytes) @ 0x00007fe0bd97e957 [0x00007fe0bd97b740+0x0000000000003217]

Libraries

  • [jvm.dll+0x374bae]
  • [libCSTBk5.so+0x43949]

活动线程

图:活动线程的堆栈跟踪

图:活动线程的堆栈跟踪

这一部分可能是报告中最重要的部分,因为它揭示了在 JVM 崩溃的精确时刻正在积极执行的线程及其随附的堆栈跟踪。在许多情况下,崩溃时主动执行的线程是识别根本原因的关键焦点。

在上面的示例中,您可以注意到线程正在“com.sap.conn.rfc.driver ”包上工作。该包存在于 SAP 驱动程序库中。显然,该应用程序在旧版本的 SAP 驱动程序上运行,已知存在错误。因此,该应用程序崩溃了。SAP 驱动程序升级后,应用程序中的 JVM 崩溃就停止了。

核心转储位置

如果 JVM 崩溃,可能会生成核心转储。本部分告知您写入这些核心转储的特定文件路径。

所有线程

图:崩溃时 JVM 中运行的所有线程

图:崩溃时 JVM 中运行的所有线程

本节深入了解崩溃时 JVM 内的线程。它包括有关线程数量、线程名称、状态和类型的详细信息。JVM 中的线程数量可能是需要考虑的关键因素,在提供的示例中,有 1464 个线程,这对于相关应用程序来说非常高。

线程的名称通常提供有关其起源或与特定线程池关联的有价值的线索。例如,在此示例中,您可以观察到有超过一千个线程源自“I/O 调度程序”线程池。了解线程环境有助于诊断 Java 应用程序中的性能和并发问题。

JVM Arguments

图:启动应用程序时的 JVM 参数

图:启动了应用程序的 JVM 参数

本节显示启动应用程序时所用的系统属性(即“D”)和 JVM 参数(-即 -“X”和“-XX:”)。

环境变量

图:设备的环境变量

图:设备的环境变量

本节包含 JVM 启动时生效的环境变量的完整列表。这些变量可以包括“PATH ”、“SHELL ”、“JAVA_HOME ”、“CLASSPATH”等关键元素。了解环境变量对于评估 Java 应用程序运行的上下文至关重要。

动态库

本节提供了启动 Java 应用程序时使用的所有库和依赖项的完整列表,包括应用程序库、第 3 方库、框架和本机库。该清单包括各种组件,例如动态库 (.dll)、共享对象 (.so) 和 Java 存档 (*.jar)。

系统

图:系统级详细信息

图:系统级详细信息

本部分提供与您的应用程序相关的系统级详细信息:

  • Operating System:它提供有关运行应用程序的操作系统的详细信息。
  • Memory: 本节介绍执行应用程序的设备的内存配置。它还报告崩溃时的内存利用率,提供对资源消耗的深入了解。
  • CPU: 您将找到有关运行应用程序的设备的 CPU 配置的信息,这有助于评估性能和兼容性。
  • JVM 版本: 报告的这一部分公开了正在使用的 JVM 版本,这对于兼容性和调试至关重要。

活动信息

报告的事件信息部分包含以下小节:

  • 内部异常: 此处报告 JVM 中抛出的最新异常。
  • 反优化事件: 有时,JVM 会将编译的(或更优化的)堆栈帧转换为解释的(或不太优化的)堆栈帧。示例:编译器最初假设引用值永远不会为空,并使用捕获内存访问对其进行测试。随后,应用程序使用空值,并且对该方法进行去优化并重新编译,以使用显式测试和分支习惯用法来检测此类空值。本节报告了最近发生的此类去优化事件。
  • 重新定义的类: 本节报告最近重新定义的类。有时,APM 代理和其他代理技术会重新定义类。
  • 编译事件: 显示最近哪些方法已从 Java 字节码编译为本机代码。

结论

在对 Java 中的“ hs_err_pid ”文件的探索中,我们深入研究了一个有价值的信息源,它可以成为诊断 JVM 崩溃的关键。通过解码“ hs_err_pid ”文件,您可以将错误消息转换为可操作的见解,使故障排除过程比所需的更加顺利。


原文链接:codingdict.net