2

我的应用程序运行一些复杂的线程,这些线程在后台线程中获取地图并绘制它们。有时,如果我在慢速网络上运行应用程序几个小时,我似乎会让它进入一个奇怪的状态,我的所有线程状态都显示 TimedWait 或 Wait(除了那些是 Native 的,例如 main)。

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

  1. 如何确定问题的原因。
  2. 什么问题之王通常会导致所有线程锁定?
  3. 有人见过类似的吗?

谢谢

在此处输入图像描述

4

1 回答 1

2

定时等待只是一个线程,它在某个指定了超时的 O/S 级别调用上被阻塞,例如简单的等待原语 ( Object.wait()) 或套接字操作 ( Socket read()/write())、线程队列等。对于任何复杂的程序来说,这都是很正常的拥有几个或多个这些 - 我有一个应用程序服务器,它通常有数百甚至数千个。

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

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

大多数体面的分析工具(和应用程序容器)都可以选择打印完整的堆栈跟踪,而更现代的工具会为您进行死锁和活锁分析。JVisualVM 工具与 Sun 的 JDK 一起分发,并且可以在网上获得,因为 VisualVM 将执行此操作,并且非常有效。大多数体面的分析器还将在堆栈跟踪中显示锁定获取(您的,上面,不在那个视图中)。

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

于 2013-10-04T15:39:28.007 回答