首先它是一个巨大的应用程序,问题涉及很多行,所以我不能真正附加任何代码。
在主要包括清除和重新添加元素到某个集合的更改之后,应用程序的摆动 GUI 冻结。在执行添加的代码时不会发生冻结,但会在一段时间后发生。奇怪的是没有线程被挂起。
我的问题是无限循环是否是这个问题的唯一解释。我觉得不太可能是这种情况,因为添加的代码完成后没有问题。可能存在一些不同步的集合访问问题,但我不认为它会导致这种情况。由于没有挂起线程,因此看起来我们也没有处理来自同步问题的死锁。
首先它是一个巨大的应用程序,问题涉及很多行,所以我不能真正附加任何代码。
在主要包括清除和重新添加元素到某个集合的更改之后,应用程序的摆动 GUI 冻结。在执行添加的代码时不会发生冻结,但会在一段时间后发生。奇怪的是没有线程被挂起。
我的问题是无限循环是否是这个问题的唯一解释。我觉得不太可能是这种情况,因为添加的代码完成后没有问题。可能存在一些不同步的集合访问问题,但我不认为它会导致这种情况。由于没有挂起线程,因此看起来我们也没有处理来自同步问题的死锁。
到头来还是僵局。
我的团队负责人告诉我,等待监视器(在“同步”上)的线程在 Eclipse 中没有显示为挂起。他找到了两个线程并要求暂停它们。然后我看到他们正在等待对方释放被占用的监视器。
死锁不是我输入的代码的错。只是我所做的更改在其他地方显示了错误的同步。
谢谢大家对我的帮助,我真的很感激。这是我关于 stackoverflow 的第一个问题,我很惊讶你的反应速度有多快。
庞大的应用程序 + 操作集合 -> 垃圾收集器开始了?
SO的一些相关阅读: 增加maxpermsize和最大堆大小的副作用
还有关于 GC 调优的 Oracle 文章: http ://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
这可能是因为在执行事件的摆动中的事件调度程序线程中等待(由于一些繁重的处理)。理想情况下,您应该在单独的线程中执行任何资源密集型任务,以便 UI 不会冻结
您可能已经知道这一点,但为了它,我想说,如果您没有在应用程序中长时间运行的进程中使用 Swing 工作程序,那么这将是使用它的理想情况。