3

しばらく実行した後、アプリケーションがデッドロックに陥ります。スレッド ダンプを取得したところ、すべてのアプリケーション スレッドが 1 つを残して次の状態でスタックしていることに気付きました

"APP-Thread-20" prio=6 tid=0x0000000007414800 nid=0x1268 waiting on condition [0x000000000951f000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.$$YJP$$park(Native Method)
    - parking to wait for  <0x00000000e0179568> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at sun.misc.Unsafe.park(Unsafe.java)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - None

実行可能な状態にある唯一のスレッドは、SAX パーサーを使用しているコードでスタックしています。そのためのスレッドダンプを以下に示します

"APP-Thread-19" prio=6 tid=0x0000000007413800 nid=0x18b4 runnable [0x00000000094de000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.$$YJP$$socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead0(SocketInputStream.java)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    - locked <0x00000000e2f3fee8> (a java.io.BufferedInputStream)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:697)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
    - locked <0x00000000e2f3ff90> (a sun.net.www.protocol.http.HttpURLConnection)
    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
    at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
    at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
    at org.apache.xerces.impl.XMLDTDScannerImpl.startPE(Unknown Source)
    at org.apache.xerces.impl.XMLDTDScannerImpl.skipSeparator(Unknown Source)
    at org.apache.xerces.impl.XMLDTDScannerImpl.scanDecls(Unknown Source)
    at org.apache.xerces.impl.XMLDTDScannerImpl.scanDTDExternalSubset(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
    at com.test.Parser.Parser.parseDocument(Parser.java:33)
    at com.test.processor.LinkExtractor.extractLinksFromXml(LinkExtractor.java:222)
    at com.test.processor.LinkExtractor.process(LinkExtractor.java:102)
    at com.test.content.pipeline.PipelineProcessingTask.run(PipelineProcessingTask.java:76)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - <0x00000000e017c3b8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

すべてのスレッドは、解析がタスクの 1 つに過ぎない一連のタスクに取り組んでいます。解析用のコードは同期されておらず、すべてのスレッドが新しい Parser().parse() を実行しています。

この問題は SAXParser に集中していますか? または私は間違った方向を見ていますか?

3 つのスレッド ダンプがあり、3 つのシナリオすべてで同じです。

解析用のコードは次のとおりです。リクエストは httpMethod です。

byte[] data = IOUtils.toByteArray(req.getResponseBodyAsStream());
body = new String(data,"UTF-8").trim();
Parser parser = new Parser();
List<String> entries = parser.parseDocument(response);
4

2 に答える 2

3

パーサーは、他のすべてのスレッドをブロックしている間、ネットワークからの入力を待機しています。

于 2013-03-07T07:22:15.137 に答える
1

したがって、アプリケーションにデッドロックはありません。

キューにタスクがありません。そのため、一部のタスクがキューに入れられる間、1 つを除くすべてのワーカーが待機します。

1 人のエグゼクティブ ワーカーが XML ソースを読み込み、SAX 経由で解析します。そして、動作が遅いようです。おそらく、XML は巨大であったり、ネットワークが遅くなったりする可能性があります。

環境に問題があります。なんらかの理由で、誰もタスクをキューに入れませんでした。また、ネットワーク経由で XML をロードするパフォーマンスを確認します。

于 2013-03-07T10:15:10.960 に答える