2 个版本

0.5.3 2024年3月19日
0.5.2 2024年3月8日

#302解析实现

Download history 1/week @ 2024-05-21 2/week @ 2024-06-11 1/week @ 2024-07-02

65 每月下载量

Apache-2.0

385KB
2K SLoC

hprof-slurp

Build status Crates.io

hprof-slurp 是一个专门的 JVM 堆转储分析器。

它以 JDK 用于编码堆转储的 hprof 格式命名。

该工具的设计在以下博客文章系列中进行了详细描述。

动机

基本动机是使系统能够分析比主机系统上可用的 RAM 大得多的 大型 堆转储。

hprof-slurp 以单遍流式处理转储文件,不将中间结果存储在主机上。

这种方法可以在不启动昂贵的大型实例的情况下,提供对转储文件的极快概述。

然而,它不能替代像 Eclipse MatVisualVM 这样的工具,这些工具提供了更高级的功能,但成本也不同。

功能

  • 显示前 n 个分配的类。
  • 显示每个类的实例数量。
  • 显示每个类的最大实例大小。
  • 显示线程堆栈跟踪。
  • 列出找到的所有 Strings

使用方法

./hprof-slurp --help
JVM heap dump hprof file analyzer

Usage: hprof-slurp [OPTIONS] --inputFile <inputFile>

Options:
  -i, --inputFile <inputFile>  binary hprof input file
  -t, --top <top>              the top results to display [default: 20]
  -d, --debug                  debug info
  -l, --listStrings            list all Strings found
  -h, --help                   Print help
  -V, --version                Print version

示例

./hprof-slurp -i "test-heap-dumps/hprof-64.bin"
Found a total of 2.53MiB of instances allocated on the heap.

Top 20 allocated classes:

+------------+-----------+-------------+----------------------------------------------+
| Total size | Instances |     Largest | Class name                                   |
+------------+-----------+-------------+----------------------------------------------+
|    1.99MiB |       436 |   634.78KiB | int[]                                        |
|  197.11KiB |      1991 |    16.02KiB | char[]                                       |
|   85.25KiB |       443 |     8.02KiB | byte[]                                       |
|   47.38KiB |      1516 |  32.00bytes | java.lang.String                             |
|   45.42KiB |       560 |     8.02KiB | java.lang.Object[]                           |
|   15.26KiB |       126 | 124.00bytes | java.lang.reflect.Field                      |
|   14.77KiB |       378 |  40.00bytes | java.util.LinkedList$Node                    |
|    9.94KiB |       212 |  48.00bytes | java.util.HashMap$Node                       |
|    8.91KiB |       190 |  48.00bytes | java.util.LinkedList                         |
|    8.42KiB |        98 |  88.00bytes | java.lang.ref.SoftReference                  |
|    6.05KiB |       258 |  24.00bytes | java.lang.Integer                            |
|    5.91KiB |        18 |     2.02KiB | java.util.HashMap$Node[]                     |
|    5.86KiB |       150 |  40.00bytes | java.lang.StringBuilder                      |
|    5.44KiB |       116 |  48.00bytes | java.util.Hashtable$Entry                    |
|    5.05KiB |        38 | 136.00bytes | sun.util.locale.LocaleObjectCache$CacheEntry |
|    5.00KiB |        40 | 128.00bytes | java.lang.ref.Finalizer                      |
|    3.50KiB |        32 | 112.00bytes | java.net.URL                                 |
|    3.42KiB |        73 |  48.00bytes | java.io.File                                 |
|    3.17KiB |        12 | 776.00bytes | java.util.Hashtable$Entry[]                  |
|    3.13KiB |        56 | 144.00bytes | java.lang.String[]                           |
+------------+-----------+-------------+----------------------------------------------+

安装

版本

使用在 https://github.com/agourlay/hprof-slurp/releases 中提供的二进制文件。

Crates.io

通过 crates.io 使用 Cargo。

cargo install hprof-slurp

性能

在现代硬件上,hprof-slurp 可以以大约 1GB/s 的速度处理堆转储文件。

为了最大限度地提高性能,请确保在具有至少 4 个核心的主机上运行。

限制

  • 仅在 JAVA PROFILE 1.0.2 & JAVA PROFILE 1.0.1 格式下进行过测试。
  • 不支持由32位JVM生成的转储文件。

生成堆转储文件

根据您的运行时配置,在JVM崩溃的情况下有时会生成堆转储文件。

也可以通过使用 jmap 触发堆转储手动完成。

示例

jmap-转储:格式=b,文件=my-hprof-文件.bin<pid>

HPROF解析的现有技术

在研究和实现此工具时,几个项目非常有用。它们在不确定的时刻提供了指导和灵感。

依赖项

~4–12MB
~126K SLoC