【问题标题】:Threads parked with HTTP-Kit使用 HTTP-Kit 停放的线程
【发布时间】:2018-01-19 00:30:08
【问题描述】:

我有几个线程在运行,每个线程都会阻塞调用 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)

任何想法可能是什么问题,或如何诊断它的指针?

【问题讨论】:

    标签: clojure apache-kafka java.util.concurrent http-kit


    【解决方案1】:

    通常的做法是设置DefaultUncaughtExceptionHandler。 如果您的线程中有异常,这至少会给您一个指示。

    (defn init-jvm-uncaught-exception-logging []
      (Thread/setDefaultUncaughtExceptionHandler
        (reify Thread$UncaughtExceptionHandler
          (uncaughtException [_ thread ex]
            (log/error ex "Uncaught exception on" (.getName thread))))))
    

    Stuart Sierra 写得很好:https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions

    【讨论】:

    • 非常感谢。不幸的是,这并没有说明问题。
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2016-02-11
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多