2013-03-07 19 views
3

我的應用程序在運行一段時間之後會遇到死鎖。我參加了一個線程轉儲,發現我的所有應用程序線程留下一個被卡住以下狀態應用程序陷入僵局

"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) 

的所有線程正在被賦予的一系列任務,其中解析是剛剛的任務之一。解析代碼不同步,每個線程都在執行一個新的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); 
+0

你能發佈與網絡調用和SAX解析相關的代碼嗎? – asgs 2013-03-07 07:24:21

+0

你是如何檢測到死鎖的?你用的是什麼工具? – Taky 2013-03-07 07:32:32

+0

@asgs我正在做一個簡單的http來獲取網頁的內容,然後將響應字符串傳遞給SAX解析器以提取所有可能的鏈接 – 2013-03-07 08:18:26

回答

3

解析器正在等待來自網絡的輸入,而它正在阻止所有其他線程。

1

所以你的應用程序沒有死鎖。

隊列中沒有任務。所以除了一個等待一些任務放入隊列中的所有工作人員。

一位行政工作人員加載XML源以通過SAX解析。看起來這是緩慢的操作。可能XML可能很大或網絡很慢。

環境問題。在某些原因中,沒有人將任務放入隊列中。還要查看通過網絡加載XML的性能。