2011-05-31 145 views
1

我有一个Web服务暴露与Spring和JAX-WS。我使用jax-ws commons来做到这一点(http://jax-ws-commons.java.net/spring/)。应用程序部署在weblogic 10.3上,有时一些线程似乎被阻塞。上次我得到一个线程转储时,我看到6个线程被标记为“STUCK”,并且这些线程正在占用%100个CPU。线程的痕迹如下:JAX-WS线程消耗%100 CPU

 "[STUCK] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00002aaaec5f8800 nid=0x3d99 run 
nable [0x0000000048ca4000] 
    java.lang.Thread.State: RUNNABLE 
     at java.util.HashMap.put(HashMap.java:374) 
     at java.util.HashSet.add(HashSet.java:200) 
     at weblogic.wsee.jaxws.ServerLateInitTube.initializeCopy(ServerLateInitTube.java:56) 
     at weblogic.wsee.jaxws.ServerLateInitTube.copy(ServerLateInitTube.java:45) 
     at weblogic.wsee.jaxws.ServerLateInitTube.copy(ServerLateInitTube.java:24) 
     at com.sun.xml.ws.api.pipe.TubeCloner.copy(TubeCloner.java:102) 
     at com.sun.xml.ws.api.pipe.TubeCloner.clone(TubeCloner.java:74) 
     at com.sun.xml.ws.server.WSEndpointImpl$2.<init>(WSEndpointImpl.java:251) 
     at com.sun.xml.ws.server.WSEndpointImpl.createPipeHead(WSEndpointImpl.java:250) 
     at com.sun.xml.ws.api.server.Adapter$Toolkit.<init>(Adapter.java:108) 
     at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.<init>(HttpAdapter.java:434) 
     at com.sun.xml.ws.transport.http.HttpAdapter.createToolkit(HttpAdapter.java:203) 
     at com.sun.xml.ws.transport.http.HttpAdapter.createToolkit(HttpAdapter.java:99) 
     at com.sun.xml.ws.api.server.Adapter$1.create(Adapter.java:117) 
     at com.sun.xml.ws.api.server.Adapter$1.create(Adapter.java:115) 
     at com.sun.xml.ws.util.Pool.take(Pool.java:78) 
     at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:248) 
     at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140) 
     at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129) 
     at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160) 
     at com.sun.xml.ws.transport.http.servlet.WSSpringServlet.doPost(WSSpringServlet.java:52) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
     at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) 
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175) 
     at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3594) 
     at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
     at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) 
     at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202) 
     at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108) 
     at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432) 
     at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) 
     at weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 

你有什么想法,为什么有stucked线程?

回答

0

我向Oracle打开了一个SR,他们为这个问题发送了一个补丁。问题似乎与补丁修复。

+0

你有没有参考这个问题在哪里/如何/释放?一些发行说明提到了10.3.1中不同主题领域的类似问题,但我们在10.3.3中遇到了这个问题。 – 2011-12-05 00:56:23

+0

我不确定这个补丁是否与最新的最新版本一起发布,它是专门为我们制作的。 – 2011-12-05 06:47:22

+0

好 - 谢谢:-) – 2012-01-08 07:19:11

1

你很可能在你的代码中有一个非终止循环,导致这种情况发生。

可以在调试器下运行,并在出现症状时暂停程序以调查每个线程的当前状态,或者使用JDK中的JVisualVM附加到正在运行的程序并获取线程转储。

基于这些知识,您可以决定瓶颈的位置,然后推断如何解决该问题。

+0

如果我没有记错的话,就会出现此问题之前,* *我的代码运行。此外,我从线程转储中捕获上面的跟踪。 – 2011-06-01 11:57:46

+0

这看起来像是为Web服务创建的EndPoint无限循环。你如何配置这些? – 2011-06-01 17:19:12

+0

这是我在spring配置文件中所做的配置。 ' <豆ID = “sendSmsWSImpl” 类= “com.XXXXX.SendSmsWebService”> \t <属性名= “sendSmsValidation” REF = “sendSmsValidation”> <属性名= “mtPreProcessorModule” REF = “mtPreProcessorModule”> ' – 2011-06-01 22:08:37

2

非同步HashMap的put方法很可能是从多个线程调用的。当有多个线程对HashMap的put方法进行大量调用时,我遇到了同样的问题。