[alibaba/arthas]arthas heapdump 获取的 dump 文件的大小是实际使用堆内存的 1/4~1/2

2024-07-17 839 views
1
环境信息
  • arthas-boot.jar 或者 as.sh 的版本: 3.6.9
  • Arthas 版本: 3.6.9
  • 操作系统版本: Linux version 5.4.0-136-generic (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1))
  • 目标进程的JVM版本: Oracle JDK 1.8, VM-VERSION=25.151-b12
  • 执行arthas-boot的版本: Oracle JDK 1.8, VM-VERSION=25.151-b12(同上)
重现问题的步骤
  1. 执行 java -jar arthas-boot.jar 然后 attach 目标进程
  2. 执行 memory 查看内存信息
  3. 执行 heapdump 获取内存 dump(不指定 --live 参数)
  4. 执行 memory,查看内存信息
  5. 执行 stop 退出 arthas
  6. 执行 jmap -dump:format=b,file=dump.hprof 1,获取内存 dump
期望的结果
  • 步骤 3 获取的 dump 文件 size 略大于步骤 2 显示的堆内存大小;
  • 步骤 3 获取的 dump 文件 size 与步骤 6 获取的 dump 文件 size 相当;
实际运行的结果
  • 步骤 3 获取的内存 dump 文件远小于步骤 2 显示的内存和步骤 6 使用 jmap 获取的dump 文件;
image image image

仅老年代内存使用就已经 970 MB,且执行 heapdump 时没有指定 --live 参数不会先进行 FullGC,理论上 dump 文件肯定大于 970MB,实际却只有 457MB。

回答

2

补充一点,同样的环境不能稳定复现

1

arthas 本质上是调用 jvm 的 jmx api 来 heapdump的。这个 arthas 本身没做特别处理。