我们遇到了一个我们无法追踪的错误,我们无法追踪某些东西冻结了我们的 Swing 线程(现在已经快 2 周了,还没有真正的结果)——我们是经验丰富的 Swing 程序员,但我们有一个庞大的程序,并且相信它存在于一些遗留代码
我想知道,除了EventQueue
在 JDK 中编辑实际类之外,还有什么方法可以让我们查看当前在 Event Dispatch Thread 上运行的所有代码片段——也许是某种工具可以让我们查看它们进入或离开事件派发线程?
我们遇到了一个我们无法追踪的错误,我们无法追踪某些东西冻结了我们的 Swing 线程(现在已经快 2 周了,还没有真正的结果)——我们是经验丰富的 Swing 程序员,但我们有一个庞大的程序,并且相信它存在于一些遗留代码
我想知道,除了EventQueue
在 JDK 中编辑实际类之外,还有什么方法可以让我们查看当前在 Event Dispatch Thread 上运行的所有代码片段——也许是某种工具可以让我们查看它们进入或离开事件派发线程?
一种有趣的方法是扩展它EventQueue
,如此处push()
所示。
记录通过事件调度线程的所有内容似乎是诊断冻结的一种繁琐方法。等到问题出现,然后询问事件调度线程现在在做什么不是更容易吗?一种方法是启用 JMX 监控,使用诸如VisualVM (JDK 附带)之类的 JMX 客户端连接到正在运行的进程,等待问题发生,然后进行线程转储。
如果您仍然希望记录 Event Dispatch Thread 正在执行的所有操作,您可以通过以下方式执行此操作:
在 上创建断点EventQueue.dispatchEvent
,右键,选择“属性”,勾选“条件”,输入以下“条件”:
System.out.println(arg0);
return false;
尝试BTrace检测 EventQueue 并在每次添加某些内容时捕获堆栈跟踪可能是个好主意。我认为最新的 VisualVM 具有允许您使用 BTrace 脚本检测正在运行的 JVM 的插件。
如果您使用的是 Oracle JRE,则已经包含一个TracedEventQueue。您可以如前所述安装它:
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new TracedEventQueue());
注意,这会输出很多输出...