2

ベンチマークにより、Apache Tomcat 7.0.59 のブートルネックが明らかになりました。サーバーがパフォーマンスの限界に達すると、ほとんどのスレッドが ClassLoader によってロックされます。

ブロックされたスレッドのスタック トレースは、次の例のようになります。

"http-bio-4504-exec-500" Id=2335 BLOCKED on java.util.jar.JarFile@464f9f8 owned by "[1432628598653] POST /services/signin HTTP/1.0" Id=1990
    at java.util.zip.ZipFile.getEntry(ZipFile.java:304)
    -  blocked on java.util.jar.JarFile@464f9f8
    at java.util.jar.JarFile.getEntry(JarFile.java:226)
    at java.util.jar.JarFile.getJarEntry(JarFile.java:209)
    at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:840)
    at sun.misc.URLClassPath$JarLoader.findResource(URLClassPath.java:818)
    at sun.misc.URLClassPath$1.next(URLClassPath.java:226)
    at sun.misc.URLClassPath$1.hasMoreElements(URLClassPath.java:236)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:583)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:581)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader$3.next(URLClassLoader.java:580)
    at java.net.URLClassLoader$3.hasMoreElements(URLClassLoader.java:605)
    at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
    at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
    at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
    at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
    at com.sun.xml.ws.util.ServiceFinder$LazyIterator.hasNext(ServiceFinder.java:443)
    at com.sun.xml.ws.util.ServiceFinder$CompositeIterator.hasNext(ServiceFinder.java:390)
    at com.sun.xml.ws.api.message.saaj.SAAJFactory.getMessageFactory(SAAJFactory.java:96)
    at com.sun.xml.ws.api.SOAPVersion.getMessageFactory(SOAPVersion.java:221)
    at com.sun.xml.ws.api.message.saaj.SAAJFactory.readAsSOAPMessage(SAAJFactory.java:275)
    at com.sun.xml.ws.api.message.saaj.SAAJFactory.readAsSAAJ(SAAJFactory.java:205)
    at com.sun.xml.ws.api.message.saaj.SAAJFactory.read(SAAJFactory.java:194)
    at com.sun.xml.ws.message.AbstractMessageImpl.toSAAJ(AbstractMessageImpl.java:199)
    at com.sun.xml.ws.api.message.MessageWrapper.readAsSOAPMessage(MessageWrapper.java:160)
    at com.sun.xml.ws.handler.SOAPMessageContextImpl.getMessage(SOAPMessageContextImpl.java:86)

ブロッカースレッドは同じ場所で実行されています

"[1432628598653] POST /services/signin HTTP/1.0" Id=1990 RUNNABLE
    at java.util.zip.ZipFile.getEntry(ZipFile.java:304)
    -  locked java.util.jar.JarFile@464f9f8
    at java.util.jar.JarFile.getEntry(JarFile.java:226)
    at java.util.jar.JarFile.getJarEntry(JarFile.java:209)
    at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:840)
    at sun.misc.URLClassPath$JarLoader.findResource(URLClassPath.java:818)
    at sun.misc.URLClassPath$1.next(URLClassPath.java:226)
    at sun.misc.URLClassPath$1.hasMoreElements(URLClassPath.java:236)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:583)
    at java.net.URLClassLoader$3$1.run(URLClassLoader.java:581)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader$3.next(URLClassLoader.java:580)
    at java.net.URLClassLoader$3.hasMoreElements(URLClassLoader.java:605)
    at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
    at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
    at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
    at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
    at com.sun.xml.ws.util.ServiceFinder$LazyIterator.hasNext(ServiceFinder.java:443)
    at com.sun.xml.ws.util.ServiceFinder$CompositeIterator.hasNext(ServiceFinder.java:390)
    at com.sun.xml.ws.api.message.saaj.SAAJFactory.read(SAAJFactory.java:190)
    at com.sun.xml.ws.message.AbstractMessageImpl.toSAAJ(AbstractMessageImpl.java:199)
    at com.sun.xml.ws.api.message.MessageWrapper.readAsSOAPMessage(MessageWrapper.java:160)
    at com.sun.xml.ws.handler.SOAPMessageContextImpl.getMessage(SOAPMessageContextImpl.java:86)

私たちのアプリケーションは間違った方法で何かをしていますか? クラスローダーでのブロックを回避する回避策はありますか?

4

1 に答える 1

0

この問題は、次のハックで完全に修正されました。

  1. -Djaxp.debug=true を JVM 引数に追加しました。
  2. 次に、JAX-WS が探していたすべてのクラスをログで見つけました。
  3. 言及されたすべてのクラスにシステム プロパティを追加しました。これにより、ServiceFinder はクラスパス内の service.properties ファイルの検索を省略しました。

最終的な JVM 引数は次のようになりました。

-Djavax.xml.soap.MetaFactory=com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl
-Djavax.xml.datatype.DatatypeFactory=com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
-Djavax.xml.stream.XMLInputFactory=com.ctc.wstx.stax.WstxInputFactory
-Djavax.xml.stream.XMLOutputFactory=com.ctc.wstx.stax.WstxOutputFactory
-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
于 2016-09-16T00:27:00.457 に答える