3

我正在 Clojure 中为 BaseX 编写一个插件,通过“lein uberjar”构建,其中包含 Clojure 解释器。在大多数情况下,这很好用。

然而——当通过 BaseX HTTP 实例运行时,评估发生在 Jetty 的线程池中,而不是在客户端断开连接后丢弃线程。

由于加载插件通过自定义类加载器加载 Clojure 的类,并且丢弃充当插件入口点的(AOT 编译的)对象实例不会丢弃 Clojure 在线程本地空间中放置的变量,因此 PermGen 会导致类加载器泄漏Clojure 解释器的多个实例最终耗尽了空间。

如何解决?如有必要,我可以对 BaseX 的模块加载/卸载机制进行合理的非 Clojure 特定更改。

4

1 回答 1

1

这个想法可能(或可能不会)有效:

  1. 不要制作 uberjar,将 Clojure jar 分开;

  2. 通过将 Clojure jar 放入 BaseX 的主类路径中,将 Clojure jar 向上推送到类加载器层次结构中(编辑启动 BasexX 服务器的命令行,类似于java -cp BaseX.jar;clojure.jar org.basex.BaseXServer);

  3. 将您的插件打包为一个 jar,其中仅包含您的代码,并依赖于主类路径中已经存在的 Clojure 类。

于 2012-04-10T20:50:09.830 回答