我正在为Clojure中的BaseX编写一个插件,它是通过包含Clojure解释器的“lein uberjar”构建的。在大多数情况下,这很有效。
然而 - 当通过BaseX HTTP实例运行时,评估发生在Jetty的线程池中,而不是在客户端断开连接后抛弃线程。
加载插件时,通过自定义类加载器加载Clojure的类,丢弃作为插件入口点的(AOT编译的)对象实例不会丢弃Clojure在线程局部空间中放置的变量,类加载器泄漏PermGen空间的结果最终被Clojure解释器的多个实例耗尽。
如何解决这个问题?如有必要,我可以对BaseX的模块加载/卸载机制进行合理的非Clojure特定更改。
答案 0 :(得分:1)
这个想法可能(或可能不)起作用:
不要做一个uberjar,让Clojure罐子分开;
将Clojure jars推入类加载器层次结构,方法是将它们放入BaseX的主类路径中(编辑启动BasexX服务器的命令行,如java -cp BaseX.jar;clojure.jar org.basex.BaseXServer
);
将您的插件打包为jar,只包含您的代码,并依赖主类路径中已存在的Clojure类。