我正在 Clojure 中为 BaseX 编写一个插件,通过“lein uberjar”构建,其中包含 Clojure 解释器。在大多数情况下,这很好用。
然而——当通过 BaseX HTTP 实例运行时,评估发生在 Jetty 的线程池中,而不是在客户端断开连接后丢弃线程。
由于加载插件通过自定义类加载器加载 Clojure 的类,并且丢弃充当插件入口点的(AOT 编译的)对象实例不会丢弃 Clojure 在线程本地空间中放置的变量,因此 PermGen 会导致类加载器泄漏Clojure 解释器的多个实例最终耗尽了空间。
如何解决?如有必要,我可以对 BaseX 的模块加载/卸载机制进行合理的非 Clojure 特定更改。