【问题标题】:JAX-WS threads consuming %100 CPU消耗 %100 CPU 的 JAX-WS 线程
【发布时间】:2011-05-31 19:26:34
【问题描述】:

我有一个使用 Spring 和 JAX-WS 公开的 Web 服务。我使用 jax-ws commons 来做到这一点(http://jax-ws-commons.java.net/spring/)。应用程序部署在 weblogic 10.3 上,有时某些线程似乎卡住了。上次我得到一个线程转储时,我看到 6 个线程被标记为“STUCK”并且这些线程正在消耗 %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)

你知道为什么会有卡住的线程吗?

【问题讨论】:

    标签: java spring jax-ws cpu


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如果我没记错的话,这个问题发生在我的代码运行之前。我还从线程转储中捕获了上面的跟踪。
      • 这看起来像是为 Web 服务创建的 EndPoint 无限循环。你如何配置这些?
      • 这是我在spring配置文件中做的配置。 &lt;wss:binding url="/sendSms" service="#sendSmsWebService"&gt;&lt;/wss:binding&gt; &lt;ws:service id="sendWebService" bean="#sendSmsWSImpl"&gt;&lt;/ws:service&gt; &lt;bean id="sendSmsWSImpl" class="com.XXXXX.SendSmsWebService"&gt; &lt;property name="sendSmsValidation" ref="sendSmsValidation"&gt;&lt;/property&gt; &lt;property name="mtPreProcessorModule" ref="mtPreProcessorModule"&gt;&lt;/property&gt; &lt;/bean&gt;
      • 这里是 web.xml 条目:&lt;servlet&gt; &lt;servlet-name&gt;jaxws-servlet&lt;/servlet-name&gt; &lt;servlet-class&gt; com.sun.xml.ws.transport.http.servlet.WSSpringServlet &lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;jaxws-servlet&lt;/servlet-name&gt; &lt;url-pattern&gt;/sendSms&lt;/url-pattern&gt; &lt;/servlet-mapping&gt;
      • 我对 WebLogic 不熟悉。您可能想问一个关于使用 WebLogic 配置 Web 服务的正确方法的新问题。
      【解决方案3】:

      我向 Oracle 开了一个 SR,他们针对这个问题发送了一个补丁。补丁似乎解决了问题。

      【讨论】:

      • 您是否对修复此问题的位置/如何/发布有某种参考?一些发行说明提到了 10.3.1 中不同主题领域的类似问题,但我们在 10.3.3 中遇到了问题。
      • 我不确定这个补丁是否有最新版本,它是专门为我们制作的。
      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2013-03-04
      • 1970-01-01
      相关资源
      最近更新 更多