我的应用程序运行一些复杂的线程,在后台线程中获取地图并绘制它们。有时,如果我在一个慢速网络上运行应用程序几个小时,我似乎会把它变成一个奇怪的状态,我的所有线程状态都显示TimedWait或Wait(除了那些像Native这样的Native)。
这是什么原因?我该怎么调试呢?我绝对迷失了,我知道这是一个普遍的问题,但如果有人能指出我正确的方向,我将不胜感激。 EG:
由于
答案 0 :(得分:2)
定时等待只是一个在某些O / S级别调用时阻塞的线程,该调用具有指定的超时,例如简单等待原语(Object.wait()
)或套接字操作(Socket read()/write()
)对于任何复杂程序来说,拥有其中的几个或多个是非常正常的 - 我有一个应用程序服务器,通常有数百甚至数千个。
您的线程可能会在无响应的连接上进行备份,而且本身可能根本就没有行为不端。可能只是需要对它们进行编程以检测和中止空闲连接。
单击您关注的每个线程,并分析它们的堆栈跟踪,了解它们是如何到达的。
大多数体面的分析工具(和应用程序容器)都可以选择打印完整的堆栈跟踪,更现代的分析工具将为您进行死锁和实时锁定分析。与Sun的JDK一起分发的JVisualVM工具可以在网上作为VisualVM使用,它非常有效。大多数体面的分析器也会在堆栈跟踪中显示锁定获取(您的,以上,不在该视图中)。
否则,您正在寻找两个或多个争用同一个锁或以不同顺序获取相同锁的线程。您可能需要通过实际检查源并注释堆栈跟踪来手动执行此操作,但如果您的工具没有指向冲突的线程,您应该能够减少可能的候选者。