从 JVM 线程本地空间卸载 Clojure 变量

2024-04-30

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

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

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

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


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

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

  2. 通过将 Clojure jars 放入 BaseX 的主类路径(编辑启动 BasexX 服务器的命令行,类似于java -cp BaseX.jar;clojure.jar org.basex.BaseXServer);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 JVM 线程本地空间卸载 Clojure 变量 的相关文章

随机推荐