Java JAX-WS线程占用%100 CPU

Java JAX-WS线程占用%100 CPU,java,spring,jax-ws,cpu,Java,Spring,Jax Ws,Cpu,我用Spring和JAX-WS公开了一个web服务。我使用jax-ws-commons来实现这一点(http://jax-ws-commons.java.net/spring/). 应用程序部署在WebLogic10.3上,有时一些线程似乎被阻塞。上次我得到一个线程转储时,我看到6个线程被标记为“卡住”,这些线程消耗了%100 CPU。线程的跟踪如下所示: "[STUCK] ExecuteThread: '7' for queue: 'weblogic.kernel.Defaul

我用Spring和JAX-WS公开了一个web服务。我使用jax-ws-commons来实现这一点(http://jax-ws-commons.java.net/spring/). 应用程序部署在WebLogic10.3上,有时一些线程似乎被阻塞。上次我得到一个线程转储时,我看到6个线程被标记为“卡住”,这些线程消耗了%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)
“[stack]ExecuteThread:'7'用于队列:'weblogic.kernel.Default(自调优)'”守护进程prio=10 tid=0x00002aaec5f8800 nid=0x3d99 run
可启用[0x0000000048ca4000]
java.lang.Thread.State:可运行
位于java.util.HashMap.put(HashMap.java:374)
在java.util.HashSet.add处(HashSet.java:200)
位于weblogic.wsee.jaxws.ServerLateInitTube.initializeCopy(ServerLateInitTube.java:56)
位于weblogic.wsee.jaxws.ServerLateInitTube.copy(ServerLateInitTube.java:45)
在weblogic.wsee.jaxws.ServerLateInitTube.copy(ServerLateInitTube.java:24)
位于com.sun.xml.ws.api.pipe.TubeCloner.copy(TubeCloner.java:102)
位于com.sun.xml.ws.api.pipe.TubeCloner.clone(TubeCloner.java:74)
位于com.sun.xml.ws.server.WSEndpointImpl$2。(WSEndpointImpl.java:251)
位于com.sun.xml.ws.server.WSEndpointImpl.createPipeHead(WSEndpointImpl.java:250)
位于com.sun.xml.ws.api.server.Adapter$Toolkit。(Adapter.java:108)
http.HttpAdapter$HttpToolkit.(HttpAdapter.java:434)
位于com.sun.xml.ws.transport.http.HttpAdapter.createToolkit(HttpAdapter.java:203)
位于com.sun.xml.ws.transport.http.HttpAdapter.createToolkit(HttpAdapter.java:99)
位于com.sun.xml.ws.api.server.Adapter$1.create(Adapter.java:117)
位于com.sun.xml.ws.api.server.Adapter$1.create(Adapter.java:115)
位于com.sun.xml.ws.util.Pool.take(Pool.java:78)
位于com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:248)
位于com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140)
位于com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129)
在com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160)上
位于com.sun.xml.ws.transport.http.servlet.WSSpringServlet.doPost(WSSpringServlet.java:52)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
位于weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
位于weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
位于weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
位于weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
在weblogic.servlet.internal.WebAppServletContext$servleinvocationAction.run(WebAppServletContext.java:3594)
位于weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
位于weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
位于weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202)
位于weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108)
位于weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432)
在weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
在weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

你知道为什么会有阻塞的线程吗?

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

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


根据这些知识,您可以确定瓶颈在哪里,然后推断如何解决它。

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

非同步HashMap的put方法很可能是从多个线程调用的。当有大量来自多个线程的对HashMap的put方法的调用时,我面临着同样的问题

会解释的,我想如果我没弄错的话,这个问题会在我的代码运行之前发生。我还从线程转储中捕获了上面的跟踪。这看起来像是web服务的端点创建无限循环。如何配置它们?这是我在spring配置文件中进行的配置
下面是web.xml条目:
jaxws-servlet com.sun.xml.ws.transport.http.servlet.WSSpringServlet jaxws-servlet/sendSms
我不熟悉WebLogic。您可能想问一个新问题,关于使用WebLogic配置您的web服务的正确方法。您是否有一些关于在何处/如何/发行版中修复此问题的参考资料?一些发行说明提到10.3.1中不同主题领域的类似问题,但是我们在10.3.3中遇到了这个问题。我不确定这个补丁是否发布了最新版本,它是专门为我们设计的。