探查丢失的执行线程模式
问题描述
一般情况下,在分析服务器挂起问题、原因不明的超时或其它引起混乱的不明行为过程中会发现丢失线程问题。在缺省的 WebLogic Server 配置中,Default 队列应当有 15 个执行线程(0 到 14)。下面是一个 Thread Dump 摘录,显示“Default”队列的 ExecuteThread 13、8、6、5 和 3 丢失。在指示线程已经终结的服务器日志记录中没有任何异常、堆栈跟踪或通知。

"ExecuteThread: '14' for queue: 'default'" daemon prio=5 tid=0x7bc140 nid=0x13c runnable [0x157ef000..0x157efdc0] at weblogic.socket.NTSocketMuxer.getNextSocket(Native Method) at weblogic.socket.NTSocketMuxer.processSockets(NTSocketMuxer.java:589) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java: 24) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)

"ExecuteThread: '12' for queue: 'default'" daemon prio=5 tid=0x7bb8e0 nid=0xc5 r unnable [0x1576f000..0x1576fdc0] at weblogic.socket.NTSocketMuxer.getNextSocket(Native Method) at weblogic.socket.NTSocketMuxer.processSockets(NTSocketMuxer.java:589) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java: 24) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)

"ExecuteThread: '11' for queue: 'default'" daemon prio=5 tid=0x7ba4e0 nid=0xf8 r unnable [0x1572f000..0x1572fdc0] at weblogic.socket.NTSocketMuxer.getNextSocket(Native Method) at weblogic.socket.NTSocketMuxer.processSockets(NTSocketMuxer.java:589) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java: 24) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)

"ExecuteThread: '10' for queue: 'default'" daemon prio=5 tid=0x7b90c0 nid=0x1a2 runnable [0x156ef000..0x156efdc0] at weblogic.socket.NTSocketMuxer.getNextSocket(Native Method) at weblogic.socket.NTSocketMuxer.processSockets(NTSocketMuxer.java:589) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java: 24) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)

"ExecuteThread: '9' for queue: 'default'" daemon prio=5 tid=0x7b9c90 nid=0xd2 wa iting on monitor [0x156af000..0x156afdc0] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:94) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:118)

"ExecuteThread: '7' for queue: 'default'" daemon prio=5 tid=0x7af2a0 nid=0x167 w aiting on monitor [0x1562f000..0x1562fdc0] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:94) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:118)

"ExecuteThread: '4' for queue: 'default'" daemon prio=5 tid=0x7b62d0 nid=0x157 w aiting on monitor [0x1556f000..0x1556fdc0] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:94) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:118)

"ExecuteThread: '2' for queue: 'default'" daemon prio=5 tid=0x7b4930 nid=0x111 w aiting on monitor [0x154ef000..0x154efdc0] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:94) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:118)
"ExecuteThread: '1' for queue: 'default'" daemon prio=5 tid=0x7b4a60 nid=0x1aa w aiting on monitor [0x154af000..0x154afdc0] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:94) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:118)

"ExecuteThread: '0' for queue: 'default'" daemon prio=5 tid=0x7b4370 nid=0xcc wa iting on monitor [0x1546f000..0x1546fdc0] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:94) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:118)

故障排除
请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。

快速链接

为什么发生此问题?
线程在抛出未捕获的异常或错误时可能会消失。这种情况会导致服务器挂起,因为其它线程可能在永远不会调用 notify() 的监视器上等待(即,要调用 notify() 的线程已经消失了)。

  • 如果设置 MaxPermSize 能够纠正此问题,有一种可能的解释是 OutOfMemoryException 在某些时候因为没有足够的 MaxPermSize 设置而被抛出。如果线程正在记录此异常,同时又发生另一个异常(例如,另一个 OutOfMemoryException),则线程将不发出任何通知就结束。一直等待该线程调用 notify() 的其它线程将挂起。

  • 如果设置 MaxPermSize 无法纠正此问题,则原因很可能是应用程序异常处理出现问题。您应当利用调试器执行代码审核或分析应用程序,以确定问题是否由未捕获的异常或错误引起的。“Hey, where'd my thread go?”一文解释了未捕获的异常和/或错误可能造成线程消失的各种情况。它还提供了如何纠正这些问题的示例。

返回页首

排除丢失执行线程故障的检查清单
  1. 进行 Thread Dump 并判断是否有任何线程丢失。您应当参考 config.xml 文件以确定在 Thread Dump 中可以看到多少执行线程。如果没有丢失任何 WebLogic 线程,那么您需要判断应用程序创建的线程是否丢失。

  2. 在一些情况下,此问题通过在服务器启动时设置 -XX:MaxPermSize JVM 选项得到了解决。MaxPermSize 可以设置为最大堆分配 (mx) 的一半。尝试设置 .XX:MaxPermSize=128m,并不断增大其值直至问题得到解决。

  3. 如果这种方法没有起到帮助作用,那么问题可能是应用程序的异常处理功能故障引起的,需要利用调试器进行代码审核或分析才能发现问题根源。有关详细信息,请参阅下列外部资源

返回页首

外部资源

返回页首

是否需要更多帮助?

如果您已经理解这个模式,但仍需要其它帮助,您可以:

  1. http://support.bea.com 上查询 AskBEA(例如使用“Missing Execute Threads”),以查找其它已发布的解决方案。
  2. http://support.bea.com 上,向 BEA 的某个新闻组中提出更详细具体的问题。

如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com


反馈

请给我们提供您的意见,说明此支持诊断模式“探查丢失的执行线程”一文是否有所帮助,您需要的任何解释,以及对支持诊断模式的新主题的任何要求。


免责声明:

依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和修补程序供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和修补程序做任何形式的担保,无论是明确的还是隐含的。

本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。

返回页首