理想情况下,答案将是平台无关的,但特定于平台的,特别是Oracle JVM,也很有用。我正在处理的项目仍在运行版本6 JVM。
特别需要与不时“冻结”的GUI有关。我很清楚在EDT上做GUI工作。该程序在Windows上运行良好,但在迁移到Linux之后,这些“奇怪的”GUI问题开始发生。实际上,在Windows到Linux移动之后,两个应用程序都出现了这个问题。 JVisualVM显示超过1000万个java.awt.EventQueueItem
个对象。怀疑是AWT队列的增长速度快于在Linux上提供的速度,因此我们的想法是在应用程序上放置一个AWT队列长度指示器,并在队列增长/缩小时查看它显示的内容。
谷歌搜索了一些this,但它对队列进行了线性扫描。也许有更好的方法?
答案 0 :(得分:3)
有趣的主题。我已经调查了一下EventQueue代码,虽然我还没有解决你的问题,但我可能会有一些有用的指示:
EventQueue.push(EventQueue)
来安装你自己的实现。队列中的所有事件都将传输到您的队列,因此您可以在将它们发布到队列时对它们进行计数。不幸的是,这仍然是线性扫描,但至少现在它是独立于平台的。 **一些调整:我没有试过这个,但我会剥离所有公共/受保护的静态代码(每个引用这些方法/变量的人都使用java.awt.EventQueue,所以你也可以),添加大小变量并使用以下四种方法更新此变量:postEvent(AWTEvent, int)
,getNextEventPrivate()
,getNextEvent(int)
和removeSourceEvent(Object, boolean)
。
此修改的一个大问题是EventQueue使用默认可见性(例如,Toolkit.getEventQueue()
和Component.getAccessControlContext()
)对AWT方法进行了一些调用,因为您不能调用它们实施将在不同的包中。您必须单独为每个案例找到一种解决方法。