需要帮助调查NetBeans RCP应用程序冻结中的线程转储

时间:2016-05-06 17:11:32

标签: netbeans-platform jstack

我有一个基于NetBeans RCP的应用程序,显然只在某些PC上,有时只是在打开一个新的TopComponent后冻结自己。老实说,我从来没有看过JVM线程转储,但我真的没有其他线索可以发生什么。不幸的是,我无法判断线程转储文件是否完整,因为jstack在尝试生成转储时会产生以下异常:

Attaching to core c:\bas.txt from executable 8836, please wait...
Error attaching to core file: Windbg Error: OpenDumpFile failed!
sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: OpenDumpFile failed!
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach0(Native Method)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach(WindbgDebuggerLocal.java:160)
        at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
        at sun.jvm.hotspot.HotSpotAgent.setupDebuggerWin32(HotSpotAgent.java:569)
        at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:335)
        at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
        at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
        at sun.tools.jstack.JStack.main(JStack.java:106)

所以我设法用控制台窗口启动我的RCP应用程序,并在挂起时按下CTRL + break。如上所述,我不能确定它是否完整,因为控制台窗口可能有更多的行从缓冲区中删除。

无论如何,这是转储文件的链接(我手动添加第一行以便在Thread Dump Analyzer中打开它):

http://pastebin.com/1M5T85i5

有人可以帮我理解吗?

由于

1 个答案:

答案 0 :(得分:0)

这听起来像是一个僵局。诊断死锁的最简单方法是使用JConsole(包含在JDK中)附加到Java程序并使用Detect Deadlock函数。

  1. 运行JAVA_HOME / bin / jconsole
  2. 选择挂起的进程,然后单击“连接”
  3. 如果您收到有关安全连接的警告,只需点击不安全按钮。
  4. 选择“线程”选项卡,然后单击“检测死锁”
  5. 如果存在死锁,GUI将突出显示参与的线程。
  6. 然后,您可以检查锁定线程的调用堆栈,并开始推断导致死锁的锁定。