如何在Java 9中删除模块层?

时间:2017-09-20 08:52:53

标签: java java-9 java-module

我有三个模块: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); 就足够了吗?

2 个答案:

答案 0 :(得分:5)

模块层,图层中的模块以及支持该层的类加载器在不再可用时可以进行GC /卸载。

如果你想对自己证明这一点,那么创建一个对layer对象的弱引用,你应该看到引用被清除(如果你使用引用队列则排队)当图层是GC时编

答案 1 :(得分:1)

EMPTY_LAYER将解决您的用例(来自该问题的一条评论,尝试将%{a: 1, b: 2}指定为根),其中对其他图层的引用不再在{您创建的{1}}:

new HashSet<>
  

返回空图层。空层中没有模块。它   没有父母。

考虑到能够从JVM中明确删除一个层,我不希望这样的API公开暴露,因为JVM应该至少有一个非空层, 引导层 ,它是在Java虚拟机启动时创建的。

如果暴露出这样的方法,我想知道用户是否也可以尝试删除这一层。虽然我试图在这方面做出技术上的假设。