使用命令行工具从堆转储(hprof)中提取JVM堆栈跟踪



我想在无头服务器上自动从JVM崩溃堆转储文件中提取堆栈跟踪。是否有非GUI解决方案?

MAT项目附带一个脚本ParseHeapDump.sh(在Windows上为*.bat(,如果您只是在堆转储上运行它,如下所示:/path/to/MAT/ParseHeapDump.sh <HEAPDUMP_NAME>.hprof,您会得到一组文件,其中一个是包含堆栈跟踪的文本文件<HEAPDUMP_NAME>.threads,例如:

Thread 0x715883630
  locals:
Thread 0x71577b418
  at java.lang.Object.wait(J)V (Native Method)
  at java.lang.ref.ReferenceQueue.remove(J)Ljava/lang/ref/Reference; (ReferenceQueue.java:155)
  at jdk.internal.ref.CleanerImpl.run()V (CleanerImpl.java:148)
  at java.lang.Thread.run()V (Thread.java:834)
  at jdk.internal.misc.InnocuousThread.run()V (InnocuousThread.java:134)
  locals:
    objectId=0x715833c30, line=1
    objectId=0x716df1990, line=1
    objectId=0x715832230, line=2
    objectId=0x71577b418, line=2
    objectId=0x71577b418, line=2
    objectId=0x71577b418, line=3
    objectId=0x71577b418, line=4
Thread 0x715883050
  at jdk.internal.misc.Unsafe.park(ZJ)V (Native Method)
  at java.util.concurrent.locks.LockSupport.parkNanos(Ljava/lang/Object;J)V (LockSupport.java:234)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(J)J (AbstractQueuedSynchronizer.java:2123)
  at java.util.concurrent.DelayQueue.take()Ljava/util/concurrent/Delayed; (DelayQueue.java:229)
  at com.intellij.util.concurrency.AppDelayQueue.lambda$new$0()V (AppDelayQueue.java:26)
  at com.intellij.util.concurrency.AppDelayQueue$$Lambda$16.run()V (Unknown Source)
  at java.lang.Thread.run()V (Thread.java:834)
  locals:
    objectId=0x715883050, line=1
    objectId=0x715cd8a90, line=2
    objectId=0x7291c6618, line=2
    objectId=0x715f73520, line=3
    objectId=0x715cd8aa8, line=3
    objectId=0x715883050, line=3
    objectId=0x715f73520, line=4
    objectId=0x715cd8ac0, line=5
    objectId=0x715883050, line=6
...

您只对此处以Thread 0x... at ...开头的行感兴趣。

注:

  1. 该脚本所做的工作比仅提取线程转储所需的工作多得多(它还解析堆,这是99.99…%的工作(;并且它会生成许多您不需要的文件(所有文件都以<HEAPDUMP_NAME>为前缀(
  2. 线程名称丢失,线程id似乎与任何特定于操作系统的东西都不对应(例如,本机线程id(;换句话说,在pstop/htop输出中找不到Thread 0x715883050——至少我不知道怎么做

在VisualVM中打开堆转储堆转储加载后,选项卡的左上角是一个下拉列表。将其切换到线程。切换线程视图

最新更新