我有三个模块:module-a,module-b,module-c。模块-a和模块-b在引导层中。模块-c的层我自己创建。 Module-c具有服务的JPMS实现,该接口位于module-a。
中这是我在module-b中使用module-c创建图层的方式。
$(document).ready(function(){
$("#content").load("pages/first.html");
});
$("li").find('a').click(function(){
var page = $(this).attr('href');
$("#content").load(page);
return false;
});
然后在module-b中我从module-c调用服务。服务执行完成后,我不再需要module-c和新创建的层。如何从JVM中删除它并释放所有资源?这样做ModuleFinder finder = ModuleFinder.of(moduleCPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("module-c"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl);
就足够了吗?
答案 0 :(得分:5)
模块层,图层中的模块以及支持该层的类加载器在不再可用时可以进行GC /卸载。
如果你想对自己证明这一点,那么创建一个对layer
对象的弱引用,你应该看到引用被清除(如果你使用引用队列则排队)当图层是GC时编
答案 1 :(得分:1)
EMPTY_LAYER
将解决您的用例(来自该问题的一条评论,尝试将%{a: 1, b: 2}
指定为根),其中对其他图层的引用不再在{您创建的{1}}:
new HashSet<>
返回空图层。空层中没有模块。它 没有父母。
考虑到能够从JVM中明确删除一个层,我不希望这样的API公开暴露,因为JVM应该至少有一个非空层, 引导层 ,它是在Java虚拟机启动时创建的。
如果暴露出这样的方法,我想知道用户是否也可以尝试删除这一层。虽然我试图在这方面做出技术上的假设。