我有几个线程在运行,每个线程都会阻塞调用 HTTP Kit。我的代码一直在工作,但最近在大约 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
因为我在各自的线程中运行一组并发 Apache Kafka 客户端的上下文。Kafka 客户端确实启动了很多自己的线程,尤其是在我运行时它几次,例如5并行)。
我所有的线程最终都像这样停在 HTTP Kit 中的事实表明存在资源泄漏,或者 HTTP Kit 中的某些代码在它有机会交付之前就死了,或者可能是资源匮乏。
另一个线程似乎卡在这里。它可能会阻止所有的承诺交付。
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)
任何想法可能是什么问题,或如何诊断它的指针?