我有几个线程在运行中,每个线程都对httpkit进行阻塞调用。我的代码一直在工作,但最近在大约30分钟后就冻结了。我的所有线程都卡在以下位置:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
clojure.core$promise$reify__7005.deref(core.clj:6823)
clojure.core$deref.invokeStatic(core.clj:2228)
clojure.core$deref.invoke(core.clj:2214)
my_project.web$fetch.invokeStatic(web.clj:35)
线路 my_project.web.clj:35
是这样的:
(let [result @(org.httpkit.client/get "http://example.com")]
(我使用的是纯java线程,而不是 core.async
因为我运行的是一组并发的apachekafka客户机的上下文,每个客户机都在自己的线程中。kafka客户机确实启动了许多自己的线程,特别是当我运行它几次时(例如并行运行5次)。
事实上,我所有的线程都像这样停在http工具包中,这意味着资源泄漏,或者http工具包中的一些代码在有机会交付之前就死了,或者可能是资源匮乏。
另一根线好像卡在这里了。有可能是它阻止了所有的承诺。
sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:850)
sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
org.httpkit.client.HttpsRequest.unwrapRead(HttpsRequest.java:35)
org.httpkit.client.HttpClient.doRead(HttpClient.java:131)
org.httpkit.client.HttpClient.run(HttpClient.java:377)
java.lang.Thread.run(Thread.java:748)
你知道问题是什么吗,或者是如何诊断的方法?
1条答案
按热度按时间vi4fp9gy1#
通常的做法是建立一个
DefaultUncaughtExceptionHandler
. 如果线程中存在异常,这至少会给您一个指示。斯图尔特·塞拉写得很好:https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions