簡體   English   中英

如何從核心轉儲文件中提取JVM堆轉儲?

[英]How to extract JVM heap dump from core dump file?

我正在嘗試將 Java 進程的 Linux 核心轉儲轉換為適合使用 Eclipse MAT 進行分析的堆轉儲文件。 根據這篇博文,適應了較新的 OpenJDK 12,我創建了一個核心轉儲,然后運行jhsdb jmap將轉儲轉換為 HPROF 格式:

>sudo gcore -o dump 24934
[New LWP 24971]
...
[New LWP 17921]
warning: Could not load shared library symbols for /tmp/jffi4106753050390578111.so.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007f94c7e9e98d in pthread_join (threadid=140276994615040, thread_return=0x7ffc716d47a8) at pthread_join.c:90
90      pthread_join.c: No such file or directory.
warning: target file /proc/24934/cmdline contained unexpected null characters
warning: Memory read failed for corefile section, 1048576 bytes at 0x7f93756a6000.
warning: Memory read failed for corefile section, 1048576 bytes at 0x7f9379bec000.
...
warning: Memory read failed for corefile section, 1048576 bytes at 0x7f94c82dd000.
Saved corefile dump.24934

> ls -sh dump.24934 
22G dump.24934

> /usr/lib/jvm/zulu-12-amd64/bin/jhsdb jmap --exe /usr/lib/jvm/zulu-12-amd64/bin/java --core dump.24934 --binaryheap --dumpfile jmap-dump.24934
Attaching to core dump.24934 from executable /usr/lib/jvm/zulu-12-amd64/bin/java, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 12.0.1+12
null

> ls -sh jmap-dump.24934 
3.3M jmap-dump.24934

核心轉儲文件是 22 Gb,而堆轉儲文件只有 3 Mb,因此jhsdb jmap命令可能無法處理整個核心轉儲。 此外,Eclipse MAT 無法打開堆轉儲文件並顯示以下消息: The HPROF parser encountered a violation of the HPROF specification that it could not safely handle. This could be due to file truncation or a bug in the JVM. The HPROF parser encountered a violation of the HPROF specification that it could not safely handle. This could be due to file truncation or a bug in the JVM.

亞歷克斯,

這有兩種可能性。

首先,gcore 是 gdb 的方便腳本。 我看到它提示一些警告消息,說加載 solib 有困難。 gdb 可能首先會生成一個損壞的核心文件。 您可以嘗試使用 gdb 加載核心文件,看看它是否可以解析它。

其次,jhsdb自己解析core文件。 您可以使用環境變量 LIBSAPROC_DEBUG=1 來獲取其跟蹤。 它將幫助您了解解析中的錯誤。

為什么不直接使用 jmap -dump dump java heap? 這將跳過核心轉儲文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM