【随手记录】java故障诊断和性能分析中 几个文件javacore heapdump dmp hprof说明

  在 Java 故障诊断和性能分析中,经常会遇到 javacoreheapdump.dmp 和 .hprof 这几类文件。它们各自有不同的目的、内容和生成方式:

  1. javacore (也称为 Thread Dump)

    • 目的: 捕获 JVM 中所有线程在某一时刻的执行状态(堆栈跟踪)。主要用于分析线程死锁、高 CPU 占用、线程阻塞、程序无响应(挂起)等问题。

    • 内容:

      • 所有活动线程的完整堆栈跟踪信息(正在执行的方法)。

      • 线程状态(如 RUNNABLE, BLOCKED, WAITING, TIMED_WAITING)。

      • 线程持有的锁信息(如果适用)。

      • 线程所属的线程组。

      • 通常还包含一些 JVM 基本信息(如命令行参数、环境变量、类路径、操作系统信息、CPU 信息、内存使用概览等)。

    • 大小: 通常相对较小(KB 到 MB 级别)。

    • 生成方式:

      • Unix/Linux: kill -3 <pid> (发送 SIGQUIT 信号给 JVM 进程)。

      • Windows: 在运行 JVM 的控制台窗口按 Ctrl + Break

      • JDK 工具: jstack <pid>

      • JVM 监控/管理工具 (如 VisualVM, JConsole)。

      • 应用服务器管理控制台。

    • 文件扩展名: 通常为 .txt.javacore.tdump 等(没有绝对标准,IBM JDK 明确使用 .javacore)。

    • 分析工具: 文本编辑器、jstack、VisualVM、IBM Thread and Monitor Dump Analyzer (TMDA)、在线分析工具等。

  2. heapdump (堆转储)

    • 目的: 捕获 JVM 堆内存在某一时刻的完整快照。用于分析内存泄漏、查找内存消耗最大的对象、理解对象引用关系、分析对象分布等内存相关问题。

    • 内容:

      • 堆中所有存活对象的详细信息(类名、字段值、地址)。

      • 对象之间的引用关系图。

      • 对象的 GC Root(根引用)信息。

      • 不包含栈信息(线程执行状态)。

    • 大小: 非常大,通常接近或等于 JVM 堆的已使用内存大小(几百 MB 到几十 GB 都有可能)。

    • 生成方式:

      • JDK 工具: jmap -dump:format=b,file=<filename.hprof> <pid>

      • JVM 参数: -XX:+HeapDumpOnOutOfMemoryError (在 OOM 时自动生成), -XX:HeapDumpPath=<path>

      • JVM 监控/管理工具 (如 VisualVM, JConsole, JMC)。

      • JMX: 调用 HotSpotDiagnosticMXBean.dumpHeap()

    • 文件扩展名/格式: 最常见的格式是 .hprof (由 Sun/Oracle JDK 工具生成的标准格式)。IBM JDK 有自己的专有堆转储格式 (通常扩展名为 .phd 或 .dmp)。有时人们会笼统地将堆转储文件称为 heapdump 或 dump

    • 分析工具: Eclipse Memory Analyzer Tool (MAT)、VisualVM、YourKit、JProfiler、IBM HeapAnalyzer (用于分析 IBM PHD 格式)、jhat (已过时)。

    • MAT也可以分析 IBM PHD 格式,需要 打开help -> install new software 选择add

         https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/runtimes/tools/dtfj/

  3. .dmp (核心转储文件 - Core Dump)

    • 目的: 捕获 整个进程(包括 JVM 本身、Java 堆、栈、本地库、操作系统资源等)在崩溃或收到特定信号时的完整内存镜像。用于分析 JVM 崩溃(JVM 本身故障,如 Segmentation Fault)、本地代码(JNI)崩溃、或严重的系统级错误。

    • 内容: 整个进程地址空间的原始内存拷贝,包含 JVM 内部数据结构、Java 堆、栈、加载的本地库、寄存器状态等。远不止是 Java 堆信息。

    • 大小: 极其巨大,通常等于进程占用的虚拟内存大小(远大于 Java 堆大小,可能达到几十 GB)。

    • 生成方式:

      • 操作系统在进程崩溃(如访问非法地址)时自动生成(通常需要配置 ulimit -c unlimited 在 Linux)。

      • 通过工具手动触发 (如 gcore <pid> 在 Linux)。

      • Windows: 通过 Dr. Watson 或 WinDbg 配置生成。

    • 文件扩展名: Linux/Unix 通常为 core 或 core.<pid>,Windows 通常为 .dmp

    • 分析工具: 需要操作系统级别的调试器:

      • Linux/Unix: gdb (GNU Debugger) + JVM 的 jhsdb 工具 (jhsdb jmap --binaryheap --dumpfile <corefile> 可以从核心转储中提取出标准的 .hprof 堆转储文件进行分析)。

      • Windows: WinDbg + SOS/SOSEX 扩展或 JVM 的调试工具。

      • 注意: 分析核心转储通常比分析 .hprof 堆转储更复杂、更底层。

  4. .hprof (Heap Profiler 格式的堆转储文件)

    • 目的: heapdump 的一种具体实现格式。它是 Sun Microsystems (后被 Oracle 继承) 的 HPROF 工具定义的一种二进制格式,用于存储堆转储数据。这是 Oracle/Sun JDK 工具(jmap)生成的堆转储的标准格式。

    • 内容: 同 heapdump - 堆中所有存活对象的详细信息及其引用关系。

    • 大小: 同 heapdump - 很大。

    • 生成方式: 同 heapdump,主要在使用 Oracle/Sun JDK 工具(如 jmap)或配置 -XX:+HeapDumpOnOutOfMemoryError 时生成。OpenJDK 也使用此格式。

    • 文件扩展名: .hprof

    • 分析工具: 同 heapdump - Eclipse MAT、VisualVM、YourKit、JProfiler 等。这是最常用、工具支持最广泛的堆转储格式。 IBM JDK 的工具(如 IBM Memory Analyzer)也能导入和分析 .hprof 文件。

  总结与区别:

特性javacore (Thread Dump)heapdump.dmp (Core Dump).hprof (Heapdump Format)
主要目的 分析线程状态 (死锁、高CPU、卡死) 分析堆内存 (泄漏、对象分布) 分析进程崩溃 (JVM/本地代码崩溃) heapdump 的标准格式
核心内容 线程栈跟踪、状态、锁信息 堆中所有对象及引用关系 整个进程内存镜像 (包括堆、栈、本地代码、OS状态) 堆中所有对象及引用关系 (二进制格式)
大小 小 (KB - MB) 很大 (≈ 堆使用量) 巨大 (≈ 进程虚拟内存) 很大 (≈ 堆使用量)
JVM 特定 是 (内容格式) 是 (概念) 否 (操作系统级) 是 (Sun/Oracle 标准格式)
典型扩展名 .txt.javacore.tdump .hprof.phd (IBM), .dmp (有时) .dmp (Win), core (Unix) .hprof
生成触发 kill -3jstack, Ctrl+Break jmap, OOM 参数, 工具 进程崩溃, gcore jmap, OOM 参数 (Sun/Oracle)
关键分析工具 jstack, VisualVM, TMDA MAT, VisualVM, JProfiler gdb/jhsdb, WinDbg/SOS MAT, VisualVM, JProfiler
核心区别点 线程执行快照 堆内存快照 整个进程崩溃快照 堆内存快照的标准格式

  简单记忆:

  • 程序卡住了? ➔ 抓 javacore (Thread Dump) 看线程在干嘛。

  • 内存泄漏了?内存快满了? ➔ 抓 heapdump (通常是 .hprof 文件) 看谁占着内存不放。

  • JVM 自己崩溃了 (Segmentation Fault 等)? ➔ 需要分析 .dmp (Core Dump) 文件找底层原因。

  • .hprof 是 heapdump 最常见、最通用的格式 (由 Sun/Oracle JDK 定义)。

  注意:

  • IBM JDK 有其特有的 javacore 格式和堆转储格式 (.phd),但通常也能处理标准的 .hprof 文件。当看到 .dmp 文件时,需要根据上下文判断:如果是 IBM JDK 的堆转储,分析方式类似 .hprof;如果是操作系统生成的核心转储,则需要用 gdb/jhsdb 或 WinDbg 分析。

  • 在生产环境获取 heapdump (.hprof) 和 .dmp (Core Dump) 要特别小心,因为它们非常大,可能影响系统性能或占满磁盘空间。获取 javacore 通常影响较小。

  • IBM相关工具下载:https://public.dhe.ibm.com/software/websphere/appserv/support/tools/
  • MAT下载:https://eclipse.dev/mat/ 可以选择国内的节点下载
posted @ 2025-08-13 17:01  空知大仙人  阅读(76)  评论(0)    收藏  举报