我看到jstack -l <pid>
vs的输出jstack -F <pid>
完全不同(尽管基本相同)。我的理解是 -F 当你使用 jdwp 协议来获取堆栈转储信息时(经验从 jstack 输出的开头注明)。
常规 jstack 的输出:
"Worker-265" #15722 prio=5 os_prio=0 tid=0x00007f12547d2000 nid=0x3890 in Object.wait() [0x00007f12e7bfc000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
- locked <0x00000000816c2b90> (a org.eclipse.core.internal.jobs.WorkerPool)
at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)
jstack -F 的输出
Thread 29628: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
- org.eclipse.core.internal.jobs.WorkerPool.sleep(long) @bci=52, line=188 (Compiled frame)
- org.eclipse.core.internal.jobs.WorkerPool.startJob(org.eclipse.core.internal.jobs.Worker) @bci=78, line=220 (Compiled frame)
- org.eclipse.core.internal.jobs.Worker.run() @bci=318, line=52 (Compiled frame)
这会导致线程堆栈转储解析实用程序(如http://spotify.github.io/threaddump-analyzer/ )出现问题,这些实用程序需要标准格式的输出。有没有办法(开关或实用程序)将输出从 jstack -F 转换为常规 jstack 输出?我懒得编写严格的正则表达式来转换输出,并且正在检查是否有人已经完成了艰苦的工作。提前致谢!