我看到jstack -l <pid>
与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输出?我懒得写严格的正则表达式来改变输出,并且正在检查是否有人已经完成了这项工作。提前谢谢!