首页 文章

Compojure OutOfMemoryError:无法创建新的本机线程

提问于
浏览
1

“我每个进程有100个线程限制 . 所以当我超过这个限制时,我得到:java.lang.OutOfMemoryError:无法创建新的本机线程.Compojure正在使用jetty环适配器 . 是否有配置服务器一次只接受一百个线程到servlet?“

这里似乎有一个简洁的解决方案,但似乎已经过时了:

Limiting the number of threads Compojure spawns

我把它放在我的project.clj中:

:dependencies [[org.clojure / clojure“1.6.0”] [compojure“1.1.8”] [ring / ring-json“0.3.1”] [c3p0 / c3p0“0.9.1.2”] [org.clojure /java.jdbc“0.2.3”] [cheshire“5.4.0”] [ring / ring-jetty-adapter“1.1.8”] [environ“0.2.1”] [hiccup“1.0.0”] [com .novemberain / monger“2.0.0”] [org.clojure / data.json“0.2.5”]]

我把它放在我的控制器文件中:

(:import [org.mortbay.thread.QueuedThreadPool])

...

(defn -main [](run-jetty app {:port(if(nil?(System / getenv“PORT”))8000; localhost或heroku?(Integer / parseInt(System / getenv“PORT”))):配置器#( . setThreadPool%(QueuedThreadPool.100))}))

当我尝试时,我得到:

线程“main”中的异常java.lang.IllegalArgumentException:无法解析类名:QueuedThreadPool,编译:

你能否向我推荐一些clojure插件注入我的库中的建议,以免在Heroku中为每个进程限制惊吓100个线程?

1 回答

  • 1

    您似乎使用的是过时版本的ring / ring-jetty-adapter(1.1.8),最新版本是1.3.2 .

    在最新版本中,您可以在ring.adapter.jetty / run-jetty选项中指定:max-threads .

    因此,要限制jetty使用的最大线程数,可以执行以下操作:

    (defn -main [] (run-jetty #'app
                              {:port (Integer/parseInt (or (System/getenv "PORT") "8000"))
                               :max-threads 100}) )
    

    当然,您的JVM中可能存在其他线程,这意味着您可能必须降低分配给jetty的线程数,以便不超过Heroku总体限制 .

    如果您仍想使用QueuedThreadPool,那么您需要使用:

    (:import [org.eclipse.jetty.util.thread QueuedThreadPool])
    

    代替

    (:import [org.mortbay.thread.QueuedThreadPool])
    

相关问题