Java 应用程序陷入僵局

Java 应用程序陷入僵局,java,multithreading,deadlock,Java,Multithreading,Deadlock,我的应用程序在运行一段时间后陷入死锁。我进行了一次线程转储,并注意到所有离开一个线程的应用程序线程都处于以下状态 "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)

我的应用程序在运行一段时间后陷入死锁。我进行了一次线程转储,并注意到所有离开一个线程的应用程序线程都处于以下状态

"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
“APP-Thread-20”优先级=6 tid=0x0000000007414800 nid=0x1268等待条件[0x000000000951f000]
java.lang.Thread.State:等待(停车)
在sun.misc.Unsafe.$$YJP$$park(本机方法)
-停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
位于sun.misc.Unsafe.park(Unsafe.java)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
位于java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
运行(Thread.java:662)
锁定可拥有的同步器:
-没有
唯一处于可运行状态的线程卡在使用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)
“APP-Thread-19”优先级=6 tid=0x0000000007413800 nid=0x18b4可运行[0x00000000094de000]
java.lang.Thread.State:可运行
位于java.net.SocketInputStream.$$YJP$$socketRead0(本机方法)
位于java.net.SocketInputStream.socketRead0(SocketInputStream.java)
位于java.net.SocketInputStream.read(SocketInputStream.java:129)
在java.io.BufferedInputStream.fill处(BufferedInputStream.java:218)
位于java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
在java.io.BufferedInputStream.read处(BufferedInputStream.java:317)
-锁定(java.io.BufferedInputStream)
位于sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:697)
http.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)
位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
-锁定(sun.net.www.protocol.http.HttpURLConnection)
位于org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(未知源)
位于org.apache.xerces.impl.XMLEntityManager.startenty(未知来源)
位于org.apache.xerces.impl.XMLEntityManager.startenty(未知来源)
位于org.apache.xerces.impl.xmldtddscannerimpl.startPE(未知来源)
位于org.apache.xerces.impl.xmldtddscannerimpl.skipSeparator(未知源)
位于org.apache.xerces.impl.xmldtddscannerimpl.scanDecls(未知来源)
位于org.apache.xerces.impl.xmldtddscannerimpl.scandtExternalSubset(未知源)
在org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(未知来源)
位于org.apache.xerces.impl.XMLDocumentFragmentScanneImpl.ScandDocument(未知来源)
位于org.apache.xerces.parsers.XML11Configuration.parse(未知源)
位于org.apache.xerces.parsers.XML11Configuration.parse(未知源)
位于org.apache.xerces.parsers.XMLParser.parse(未知源)
位于org.apache.xerces.parsers.AbstractSAXParser.parse(未知源)
位于org.apache.xerces.jaxp.SAXParserImpl$jaxpsaxpasser.parse(未知源代码)
位于org.apache.xerces.jaxp.SAXParserImpl.parse(未知源)
位于javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
位于com.test.Parser.Parser.parseDocument(Parser.java:33)
位于com.test.processor.LinkExtractor.extractLinksFromXml(LinkExtractor.java:222)
在com.test.processor.LinkExtractor.process(LinkExtractor.java:102)
位于com.test.content.pipeline.PipelineProcessingTask.run(PipelineProcessingTask.java:76)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
运行(Thread.java:662)
锁定可拥有的同步器:
-(一个java.util.concurrent.locks.ReentrantLock$NonfairSync)
所有线程都在处理一系列任务,其中解析只是任务之一。解析代码未同步,每个线程都在执行一个新的解析器()。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);
byte[]data=IOUtils.toByteArray(req.getResponseBodyAsStream());
body=新字符串(数据,“UTF-8”).trim();
Parser Parser=新解析器();
列表条目=parser.parseDocument(响应);

您的解析器正在等待来自网络的输入,同时它正在阻止所有其他线程

因此应用程序中没有死锁

队列中没有任务。因此,除了一个工人外,所有工人都在等待一些任务放入队列

一名执行人员通过SAX加载要解析的XML源。看起来是慢动作。XML可能很大,也可能网络速度较慢


环境问题。在某些情况下,没有人将任务放入队列。还要检查通过网络加载XML的性能。

能否发布与网络调用和SAX解析相关的代码?如何检测死锁?您使用了哪个工具?@asgs我正在执行一个简单的http get以获取网页内容,然后将响应字符串传递给SAX解析器以提取所有可能的内容links@Taky,我没有检测到死锁,但即使队列中有作业,应用程序也无法执行任何工作。日志中没有异常,堆中有足够的空间。@VarunPathak代码中的response对象是什么?如何使用字符串对象?