当前位置: 首页 > 知识库问答 >
问题:

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

东郭弘
2023-03-14

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

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

共有1个答案

徐翔
2023-03-14

这个想法可能(也可能不起作用):

>

  • 不要制作uberjar,保持Clojure罐子分开;

    通过将Clojure jar放入BaseX的主类路径(编辑启动BasexX服务器的命令行,类似于java-cp BaseX.jar;Clojure.jar org.BaseX.basexserver)将它们推上类加载器层次结构;

  •  类似资料:
    • 问题内容: 我需要卸载已加载的DLL ,有人知道这是否可能吗? 问题答案: 我对此没有任何经验,但是有一点挖掘表明,当对加载库的类加载器进行垃圾收集时,应该卸载该库。 链接: 调用API文档(Sun)-查找“库和版本管理” Java JNI DLL卸载教程

    • 线程本地变量允许程序中的每个线程都有一个独立的实例拷贝。可以使用thread_local关键字来对这样的变量进行声明。命名空间内的变量,静态成员变量,以及本地变量都可以声明成线程本地变量,为了在线程运行前对这些数据进行存储操作: thread_local int x; // 命名空间内的线程本地变量 class X { static thread_local std::string s;

    • 由于install4j没有一个维护安装程序来允许删除部分组件,我修改了卸载程序,以创建显示每个可卸载组件的可配置表单,然后简单地根据用户选择删除文件,这反过来意味着删除标准卸载屏幕。

    • 问题内容: 我的问题: 在本地运行的两个或多个JVM实例之间进行通信应该/应该采用哪种方法? 问题的一些描述: 我正在为一个项目开发系统,该项目需要单独的JVM实例以完全将某些任务彼此隔离。 在运行时,“父” JVM将创建期望执行的“子” JVM,然后将结果返回给它(以相对简单的POJO类或结构化XML数据的格式)。这些结果不应使用SysErr / SysOut / SysIn管道进行传输,因为子

    • 当我为Clojure项目启动lein repl时,将导入命名空间clojure.repl。 如果我在Emacs中使用Slime和Clojure-jack-in,我会得到一个没有这个的repl。(莱宁根2) 如何配置Leiningen(或Slime?或Clojure模式?)要在每次启动时导入此。

    • 我已经安装了MongoDB 3.0.1以下命令在Ubuntu上安装MongoDB社区版在我的ubuntu 14.04 64位系统和我安装Robomongo接口使用。 当我尝试使用Robomongo连接MongoDB时,我得到一个错误,授权失败。我发现添加了对SCRAM-SHA-1身份验证(MongoDB 3.0)的支持,这解释了Robomongo 0.8。5不支持MongoDB 3.0。X完全。