2 个版本
0.5.3 | 2024年3月19日 |
---|---|
0.5.2 | 2024年3月8日 |
#302 在 解析实现
65 每月下载量
385KB
2K SLoC
hprof-slurp
hprof-slurp
是一个专门的 JVM 堆转储分析器。
它以 JDK 用于编码堆转储的 hprof
格式命名。
该工具的设计在以下博客文章系列中进行了详细描述。
动机
基本动机是使系统能够分析比主机系统上可用的 RAM 大得多的 大型 堆转储。
hprof-slurp
以单遍流式处理转储文件,不将中间结果存储在主机上。
这种方法可以在不启动昂贵的大型实例的情况下,提供对转储文件的极快概述。
然而,它不能替代像 Eclipse Mat 和 VisualVM 这样的工具,这些工具提供了更高级的功能,但成本也不同。
功能
- 显示前
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