我在移动中有几个线程,每个线程都阻止调用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 Client确实启动了很多自己的线程,尤其是当我运行它几次时,例如并行运行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)
任何想法可能是什么问题,或指示如何诊断它?
答案 0 :(得分:0)
常见的事情是设置DefaultUncaughtExceptionHandler
。
这至少可以为您提供线程中是否存在异常的指示。
(defn init-jvm-uncaught-exception-logging []
(Thread/setDefaultUncaughtExceptionHandler
(reify Thread$UncaughtExceptionHandler
(uncaughtException [_ thread ex]
(log/error ex "Uncaught exception on" (.getName thread))))))
斯图尔特·塞拉在这方面写得很好:https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions