2013-10-04 34 views
2

我的应用程序运行一些复杂的线程,在后台线程中获取地图并绘制它们。有时候,如果我在缓慢的网络上运行应用程序几个小时,我似乎将它变成了一种奇怪的状态,在这种状态下,我的所有线程状态都显示为TimedWait或Wait(除了像Native这样的本机外)。线程状态TimedWait。如何调试?

这是什么原因?我该如何调试它?我绝对失去了,我知道这是一个普遍的问题,但如果有人能指出我正确的方向,我将不胜感激。 EG:

  1. 如何指出问题的原因。
  2. 问题之王通常会导致所有线程锁定?
  3. 有人看过类似的东西吗?

由于

enter image description here

+0

它正好在底部的堆栈轨迹中。 –

+0

@SoftwareMonkey只是一个线程iv'e突出显示。 Al上面的那些线程也在TimeWait中。我不知道是什么造成了这一点。 – nedaRM

回答

2

一个定时是简单地被阻塞在其上已超时指定,诸如简单等待原语(Object.wait())一些O/S级呼叫螺纹或套接字操作(Socket read()/write()),线程队列等等。对于任何复杂的程序来说,这是非常正常的,有几个或多个这样的东西 - 我有一个通常有数百甚至数千个应用程序服务器。

您的线程可能会在无响应的连接上进行备份,并且本身可能不会行为不端。它可能只是您需要对它们进行编程以检测并中止空闲连接。

单击您关心的每个线程并分析它们的堆栈跟踪,了解它们如何到达那里。

最体面的分析工具(和应用程序容器)将可以选择打印完整的堆栈跟踪,而更现代的将为您进行死锁和活锁分析。与Sun的JDK一起分发的JVisualVM工具可作为VisualVM在网络上提供,这非常有效。大多数体面的配置文件还会在堆栈跟踪中显示锁定捕获(您的上述情况不在该视图中)。

否则,您正在寻找两个或更多线程竞争相同的锁或以不同的顺序获取相同的锁。您可能需要通过实际检查源代码并注释堆栈跟踪来手动执行此操作,但是如果您的工具没有指向冲突线程,则应该能够减少可能的候选项。