您是否想过当 Java 虚拟机 (JVM) 遇到严重错误并意外崩溃时会发生什么?好吧,此时 JVM 会生成一个名为“ hs_err_pid ”的神秘文件。在这篇文章中,我们将揭开这个文件的谜团。我们将深入研究它的用途,学习如何解读其内容,并探索当您的 Java 应用程序出现问题时它提供的重要信息。因此,如果您曾经对“ hs_err_pid ”文件感到困惑,或者您只是好奇如何理解它,请继续阅读以发现您需要的关键见解。
当 Java 虚拟机 (JVM) 遇到严重错误并崩溃时,它会以“ hs_err_pid ”文件的形式留下痕迹。该文件是一个信息金矿,包含各个级别的详细信息,例如线程、库、应用程序、资源、环境和系统。它作为崩溃时 JVM 状态的综合报告。这些细节对于诊断事故原因非常宝贵。
当 JVM 崩溃时,“ hs_err_pid ”文件的位置确定如下:
“ hs_err_pid ”文件是纯文本文档,虽然可以通过使用标准文本编辑器打开它来访问和检查其内容,但由于其技术性质,解释文件中的原始数据可能是一项具有挑战性的任务。在许多情况下,解密原始格式的文件可能非常复杂且耗时。
为了简化流程并使信息更易于访问,许多开发人员选择使用fastThread等专用工具。该工具旨在解析“ hs_err_pid ”文件,并以更具可读性和组织性的格式呈现数据,并附有图表和指标。
图: fastThread 工具分析hs_err_pid文件
您可以使用 fastThread 工具分析“ hs_err_pid”文件。
完成这些步骤后,fastThread 将立即生成一份综合报告。本报告旨在为您提供丰富的信息。它包含多个部分,可帮助您深入了解 JVM 问题。继续阅读这篇文章以了解这些部分。
图:JVM版本信息
报告的第一部分专门提供有关 Java 虚拟机 (JVM) 的关键详细信息。它包括:
图:JVM 崩溃的高级原因
在本节中,您将找到导致 JVM 崩溃的高级原因。常见的崩溃原因包括:
有关这些原因的解释,您可以参考此Oracle 文档。
图:JVM 内存区域利用率
本节提供 JVM 内部内存区域的分配和消耗内存的详细信息:
了解这些内存区域的分配和使用大小对于诊断与内存消耗相关的问题至关重要。在内存泄漏的情况下,您可能会观察到已用大小接近其最大容量。
在本节中,您将找到发生崩溃时 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]
图:活动线程的堆栈跟踪
这一部分可能是报告中最重要的部分,因为它揭示了在 JVM 崩溃的精确时刻正在积极执行的线程及其随附的堆栈跟踪。在许多情况下,崩溃时主动执行的线程是识别根本原因的关键焦点。
在上面的示例中,您可以注意到线程正在“com.sap.conn.rfc.driver ”包上工作。该包存在于 SAP 驱动程序库中。显然,该应用程序在旧版本的 SAP 驱动程序上运行,已知存在错误。因此,该应用程序崩溃了。SAP 驱动程序升级后,应用程序中的 JVM 崩溃就停止了。
如果 JVM 崩溃,可能会生成核心转储。本部分告知您写入这些核心转储的特定文件路径。
图:崩溃时 JVM 中运行的所有线程
本节深入了解崩溃时 JVM 内的线程。它包括有关线程数量、线程名称、状态和类型的详细信息。JVM 中的线程数量可能是需要考虑的关键因素,在提供的示例中,有 1464 个线程,这对于相关应用程序来说非常高。
线程的名称通常提供有关其起源或与特定线程池关联的有价值的线索。例如,在此示例中,您可以观察到有超过一千个线程源自“I/O 调度程序”线程池。了解线程环境有助于诊断 Java 应用程序中的性能和并发问题。
图:启动了应用程序的 JVM 参数
本节显示启动应用程序时所用的系统属性(即“D”)和 JVM 参数(-即 -“X”和“-XX:”)。
图:设备的环境变量
本节包含 JVM 启动时生效的环境变量的完整列表。这些变量可以包括“PATH ”、“SHELL ”、“JAVA_HOME ”、“CLASSPATH”等关键元素。了解环境变量对于评估 Java 应用程序运行的上下文至关重要。
本节提供了启动 Java 应用程序时使用的所有库和依赖项的完整列表,包括应用程序库、第 3 方库、框架和本机库。该清单包括各种组件,例如动态库 (.dll)、共享对象 (.so) 和 Java 存档 (*.jar)。
图:系统级详细信息
本部分提供与您的应用程序相关的系统级详细信息:
报告的事件信息部分包含以下小节:
在对 Java 中的“ hs_err_pid ”文件的探索中,我们深入研究了一个有价值的信息源,它可以成为诊断 JVM 崩溃的关键。通过解码“ hs_err_pid ”文件,您可以将错误消息转换为可操作的见解,使故障排除过程比所需的更加顺利。
原文链接:codingdict.net