我的应用程序运行一些复杂的线程,在后台线程中获取映射并绘制它们。有时候,如果我在一个缓慢的网络上运行这个应用程序几个小时,我似乎会让它进入一种奇怪的状态,在这种状态下,我的所有线程状态都显示TimedWait或等待(除了那些原生的线程,比如main)。
原因是什么?我如何调试它?我完全迷失了方向,我知道这是一个笼统的问题,但如果有人能给我指明正确的方向,我将不胜感激。例:
谢谢

发布于 2013-10-04 15:39:28
定时等待只是在指定超时的O/S级别调用上被阻塞的线程,例如简单等待原语(Object.wait())或套接字操作(Socket read()/write())、线程队列等。任何复杂的程序都有几个或多个这样的线程,这是很正常的--我有一个应用服务器,它通常有数百甚至数千个。
您的线程可能在无响应的连接上进行备份,并且可能根本没有行为不当,其本身就是如此。您可能只需对它们进行编程,以检测和中止空闲连接。
单击您关心的每个线程,并分析它们的堆栈跟踪,了解它们是如何到达那里的。
大多数体面的分析工具(和应用程序容器)都可以选择打印一个完整的堆栈跟踪,而更现代的工具将为您进行死锁和活锁分析。JVisualVM工具与Sun的JDK一起发布,并且可以在网络上使用,因为VisualVM会做到这一点,而且非常有效。大多数体面的分析器还将在堆栈跟踪中显示锁获取(您的,上面,不在此视图中)。
否则,您将寻找两个或多个线程争用相同的锁或以不同的顺序获取相同的锁。您可能需要通过实际检查源和注释堆栈跟踪来手动完成此操作,但如果工具没有正确指向冲突线程,则应该能够减少可能的候选项。
https://stackoverflow.com/questions/19173420
复制相似问题