我自己写了一个爬虫程序,跑了半天后程序就卡死了,没有任何输出和动静。
先是使用jstatdVisualVM,参考这篇文章:jstatd,VisualVM使用和报错解决
结果如下图:

看到内存毫无变化,应该是发生了死锁。


使用命令jstack查看线程堆栈状态:

-> % jstack 26924
2019-12-23 09:53:38
Full thread dump OpenJDK 64-Bit Server VM (11.0.4+11-post-Ubuntu-1ubuntu218.04.3 mixed mode, sharing):Threads class SMR info:
_java_thread_list=0x00007f35dc0035b0, length=20, elements={0x00007f360c011000, 0x00007f360c0b0800, 0x00007f360c0b2800, 0x00007f360c0b8800,
0x00007f360c0ba800, 0x00007f360c0bd000, 0x00007f360c0bf000, 0x00007f360c0f9000,
0x00007f360c0fe800, 0x00007f360c20f800, 0x00007f360c249000, 0x00007f360c378800,
0x00007f360c38b000, 0x00007f360c389800, 0x00007f360c390000, 0x00007f360c391800,
0x00007f360c393000, 0x00007f360c395800, 0x00007f360c38e000, 0x00007f35dc001800
}"main" #1 prio=5 os_prio=0 cpu=697257.22ms elapsed=65383.05s tid=0x00007f360c011000 nid=0x692d waiting on condition  [0x00007f3612f97000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000e3c00020> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:379)at org.apache.http.pool.AbstractConnPool.access$200(AbstractConnPool.java:69)at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:245)- locked <0x00000000e3c000b0> (a org.apache.http.pool.AbstractConnPool$2)at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:193)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:304)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:280)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at com.zhang.spider.getHtml(spider.java:219)at com.zhang.spider.main(spider.java:145)"pool-1-thread-1" #13 prio=5 os_prio=0 cpu=68909.14ms elapsed=65380.72s tid=0x00007f360c378800 nid=0x693f waiting on condition  [0x00007f35f0c38000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)JNI global refs: 17, weak refs: 0

看到线程池中的线程状态是java.lang.Thread.State: WAITING (parking)parking to wait for <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject),这是正常的线程等待状态。

发现主线程有问题,虽然同样是java.lang.Thread.State: WAITING (parking)
但在等锁parking to wait for <0x00000000e3c00020> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

发现问题是由org.apache.http.impl.client.CloseableHttpClient造成的。
然后看到了这篇文章:记一次 HttpClient 死锁问题 | Mr.Kail’s Blog


一个解决办法是升级库的版本:

    <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.10</version></dependency>

另一个办法是记得关闭连接:

try (CloseableHttpClient httpclient = HttpClients.createDefault()) {CloseableHttpResponse response = httpclient.execute(url);response.close();
}

还有就是记得设置超时:

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet=newHttpGet("http://www.baidu.com");//HTTP Get请求(POST雷同)
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();//设置请求和传输超时时间
httpGet.setConfig(requestConfig);
httpClient.execute(httpGet);//执行请求


jstack完整结果:

-> % jstack 26924
2019-12-23 09:53:38
Full thread dump OpenJDK 64-Bit Server VM (11.0.4+11-post-Ubuntu-1ubuntu218.04.3 mixed mode, sharing):Threads class SMR info:
_java_thread_list=0x00007f35dc0035b0, length=20, elements={0x00007f360c011000, 0x00007f360c0b0800, 0x00007f360c0b2800, 0x00007f360c0b8800,
0x00007f360c0ba800, 0x00007f360c0bd000, 0x00007f360c0bf000, 0x00007f360c0f9000,
0x00007f360c0fe800, 0x00007f360c20f800, 0x00007f360c249000, 0x00007f360c378800,
0x00007f360c38b000, 0x00007f360c389800, 0x00007f360c390000, 0x00007f360c391800,
0x00007f360c393000, 0x00007f360c395800, 0x00007f360c38e000, 0x00007f35dc001800
}"main" #1 prio=5 os_prio=0 cpu=697257.22ms elapsed=65383.05s tid=0x00007f360c011000 nid=0x692d waiting on condition  [0x00007f3612f97000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000e3c00020> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:379)at org.apache.http.pool.AbstractConnPool.access$200(AbstractConnPool.java:69)at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:245)- locked <0x00000000e3c000b0> (a org.apache.http.pool.AbstractConnPool$2)at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:193)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:304)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:280)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at com.zhang.spider.getHtml(spider.java:219)at com.zhang.spider.main(spider.java:145)"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=633.83ms elapsed=65383.04s tid=0x00007f360c0b0800 nid=0x692f waiting on condition  [0x00007f35f2e05000]java.lang.Thread.State: RUNNABLEat java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.4/Native Method)at java.lang.ref.Reference.processPendingReferences(java.base@11.0.4/Reference.java:241)at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.4/Reference.java:213)"Finalizer" #3 daemon prio=8 os_prio=0 cpu=416.22ms elapsed=65383.04s tid=0x00007f360c0b2800 nid=0x6930 in Object.wait()  [0x00007f35f2d04000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.4/Native Method)- waiting on <no object reference available>at java.lang.ref.ReferenceQueue.remove(java.base@11.0.4/ReferenceQueue.java:155)- waiting to re-lock in wait() <0x00000000ece87490> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@11.0.4/ReferenceQueue.java:176)at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.4/Finalizer.java:170)"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.58ms elapsed=65383.03s tid=0x00007f360c0b8800 nid=0x6931 runnable  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 cpu=45406.61ms elapsed=65383.03s tid=0x00007f360c0ba800 nid=0x6932 waiting on condition  [0x0000000000000000]java.lang.Thread.State: RUNNABLENo compile task"C1 CompilerThread0" #6 daemon prio=9 os_prio=0 cpu=3312.09ms elapsed=65383.03s tid=0x00007f360c0bd000 nid=0x6933 waiting on condition  [0x0000000000000000]java.lang.Thread.State: RUNNABLENo compile task"Sweeper thread" #7 daemon prio=9 os_prio=0 cpu=823.19ms elapsed=65383.03s tid=0x00007f360c0bf000 nid=0x6934 runnable  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Service Thread" #8 daemon prio=9 os_prio=0 cpu=0.06ms elapsed=65382.99s tid=0x00007f360c0f9000 nid=0x6935 runnable  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Common-Cleaner" #9 daemon prio=8 os_prio=0 cpu=47.58ms elapsed=65382.99s tid=0x00007f360c0fe800 nid=0x6937 in Object.wait()  [0x00007f35f23c2000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.4/Native Method)- waiting on <no object reference available>at java.lang.ref.ReferenceQueue.remove(java.base@11.0.4/ReferenceQueue.java:155)- waiting to re-lock in wait() <0x00000000ece87c80> (a java.lang.ref.ReferenceQueue$Lock)at jdk.internal.ref.CleanerImpl.run(java.base@11.0.4/CleanerImpl.java:148)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)at jdk.internal.misc.InnocuousThread.run(java.base@11.0.4/InnocuousThread.java:134)"commons-pool-evictor-thread" #11 daemon prio=5 os_prio=0 cpu=229.97ms elapsed=65382.54s tid=0x00007f360c20f800 nid=0x6938 waiting on condition  [0x00007f35f1a8e000]java.lang.Thread.State: TIMED_WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ece87e58> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.4/LockSupport.java:234)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.4/AbstractQueuedSynchronizer.java:2123)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.4/ScheduledThreadPoolExecutor.java:1182)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.4/ScheduledThreadPoolExecutor.java:899)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"Abandoned connection cleanup thread" #12 daemon prio=5 os_prio=0 cpu=737.84ms elapsed=65382.34s tid=0x00007f360c249000 nid=0x6939 in Object.wait()  [0x00007f35f178a000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.4/Native Method)- waiting on <no object reference available>at java.lang.ref.ReferenceQueue.remove(java.base@11.0.4/ReferenceQueue.java:155)- waiting to re-lock in wait() <0x00000000ece880b8> (a java.lang.ref.ReferenceQueue$Lock)at com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:64)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1128)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-1" #13 prio=5 os_prio=0 cpu=68909.14ms elapsed=65380.72s tid=0x00007f360c378800 nid=0x693f waiting on condition  [0x00007f35f0c38000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-2" #14 prio=5 os_prio=0 cpu=68813.70ms elapsed=65380.48s tid=0x00007f360c38b000 nid=0x6940 waiting on condition  [0x00007f35f0937000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-3" #15 prio=5 os_prio=0 cpu=68525.68ms elapsed=65380.15s tid=0x00007f360c389800 nid=0x6942 waiting on condition  [0x00007f35f0836000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-4" #16 prio=5 os_prio=0 cpu=68409.74ms elapsed=65379.87s tid=0x00007f360c390000 nid=0x6943 waiting on condition  [0x00007f35f0735000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-5" #17 prio=5 os_prio=0 cpu=68613.59ms elapsed=65379.60s tid=0x00007f360c391800 nid=0x6944 waiting on condition  [0x00007f35f0634000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-6" #18 prio=5 os_prio=0 cpu=68764.39ms elapsed=65379.37s tid=0x00007f360c393000 nid=0x6945 waiting on condition  [0x00007f35f0333000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-7" #19 prio=5 os_prio=0 cpu=68636.98ms elapsed=65379.17s tid=0x00007f360c395800 nid=0x694b waiting on condition  [0x00007f35f0232000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"pool-1-thread-8" #20 prio=5 os_prio=0 cpu=68529.14ms elapsed=65378.94s tid=0x00007f360c38e000 nid=0x694c waiting on condition  [0x00007f35f0131000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@11.0.4/Native Method)- parking to wait for  <0x00000000ecfae070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@11.0.4/LockSupport.java:194)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.4/AbstractQueuedSynchronizer.java:2081)at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.4/LinkedBlockingQueue.java:433)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.4/ThreadPoolExecutor.java:1054)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.4/ThreadPoolExecutor.java:1114)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.4/ThreadPoolExecutor.java:628)at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)"Attach Listener" #21 daemon prio=9 os_prio=0 cpu=0.33ms elapsed=0.10s tid=0x00007f35dc001800 nid=0x6473 waiting on condition  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"VM Thread" os_prio=0 cpu=37188.73ms elapsed=65383.04s tid=0x00007f360c0ad800 nid=0x692e runnable  "VM Periodic Task Thread" os_prio=0 cpu=40128.86ms elapsed=65382.99s tid=0x00007f360c0fb800 nid=0x6936 waiting on condition  JNI global refs: 17, weak refs: 0

记一次Java多线程程序调试经历:HttpClient 死锁相关推荐

  1. 一小时让你Get到面试套路:记一次Java初中级程序员面试流程梳理

    视频教程传送门: 一小时让你Get到面试套路:记一次Java初中级程序员面试流程梳理_哔哩哔哩_bilibili听了N多个师兄师姐的面试录音,采访了N多个师兄时间的面试经历,才总结出来的java面试流 ...

  2. JAVA多线程程序ProgressBar

    JAVA多线程程序ProgressBar 题目简介: 思维导图: 实验代码:建议先看CalThread类,计算线程的实现,再作基本CalFrame类的界面, 然后作ReadThread类,结合CalF ...

  3. java 多线程 卖票_编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示);...

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示); 程序分析:(1)票数要使用同一个静态值: (2)为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: (1 ...

  4. java多线程同步与死锁_浅析Java多线程中的同步和死锁

    Value Engineering 1基于Java的多线程 多线程是实现并发机制的一种有效手段,它允许编程语言在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,且与进程一样拥有独立 ...

  5. Java多线程学习之路(四)---死锁(DeadLock)

    Java多线程学习之路(四)-死锁(DeadLock) 1.定义 死锁就是多个线程在竞争共享资源的时候,相互阻塞,不能脱身的状态(个人理解).其实死锁一定程度上可以看成一个死循环. 举个现实生活中的例 ...

  6. Java多线程编程(四)——死锁问题

    死锁 什么是死锁? 什么情况下会产生死锁? 生产者与消费者 什么是生产者与消费者? Object类的等待和唤醒方法 生产者-消费者案例(唤醒机制) 基本写法 代码书写技巧与"套路" ...

  7. Java多线程-程序运行堆栈分析

    class文件内容 class文件包含JAVA程序执行的字节码:数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. ...

  8. java多线程程序性能调优 优化过程

    我, 一多年c++开发,由于项目原因需要对一个性能底下的多线程java程序进行调优,百度google了几把,妈蛋,没有发现指导如何java线程调优的文章啊,都是一些java使用规范,我去,那我大jav ...

  9. 【Java】程序调试

    在我们写程序中,调试是必不可少的,下面介绍一下调试的原理和方法: 1.为什么需要调试? 因为程序出现问题的概率很高,甚至几乎是肯定的,那么排除错误的能力对于程序员而言就至关重要了.在实际项目中,调试的 ...

最新文章

  1. Office Live for Small Business--开启您创业的大门
  2. 除了工商银行,目前中国还有那些宇宙级别的企业?
  3. 洛谷 P1162 填涂颜色-dfs染色法
  4. 项目开发一些注意事项
  5. JavaScript-分支和循环
  6. linux lp 打印中文,Linux基础命令---lp打印文件
  7. 如何对RTSP播放器做功能和性能评估
  8. pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...
  9. Python入门--算术运算符,位运算符,比较运算符,布尔运算符,赋值运算符
  10. ASP.NET 如何在网页中获取根目录
  11. 最强面试题整理第三弹:Python 后台开发面试题(附答案)
  12. 小程序码 踩坑记录(buffer转成图片显示问题)
  13. 联想sr550服务器虚拟机,联想(Lenovo)SR550
  14. U1C1 数据挖掘与文本分析的背景与实际应用
  15. 计算机开根号原理,根号的原理_怎么开的根号,有原理吗
  16. 分析智联招聘的API接口,进行数据爬取
  17. 实现74HC85的功能以及16位数值比较器
  18. python爬虫,爬取豆瓣电影《芳华》电影短评,分词生成云图。
  19. 【ISP】CMOS(3)-sensor特性
  20. C++ 高阶操作:模板元编程

热门文章

  1. JavaScript权威Douglas Crockford:代码阅读和每个人都该学的编程
  2. Python 计算欧氏距离
  3. 用python编写脚本实现备份文件
  4. Case study:数据库网页构建原理和实践
  5. sangerbox平台使用(二)差异分析
  6. varchar汉字占几个字符_常用字符编码介绍
  7. Mol Plant | 中科院遗传与发育生物学研究所周俭民课题组报道了细菌效应蛋白在植物细胞内诱导免疫受体ZAR1寡聚的新发现...
  8. pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row)
  9. R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)
  10. Python使用numpy中trim_zeros函数去除首尾0值的语法