Java9中如何去掉模块层?

How to remove module layer in Java 9?

我有三个模块:模块-a、模块-b、模块-c。 Module-a和module-b在引导层。我自己创建的 module-c 层。模块-c 具有服务的 JPMS 实现,接口在模块-a 中。

这是我在module-b中用module-c创建层的方式

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);

然后在模块-b 中我从模块-c 调用服务。服务执行完成后,我不再需要 module-c 和新创建的层。如何将其从 JVM 中移除并释放所有资源? layer = null;够吗?

EMPTY_LAYER 应在此处解决您的用例(来自对问题的评论之一,试图将 new HashSet<> 分配为根),其中不再处理对其他层的引用您创建的 layer :

layer = ModuleLayer.empty();

Returns the empty layer. There are no modules in the empty layer. It has no parents.


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

如果暴露了这样的方法,不知道用户是否也可以尝试去掉这一层。虽然我试图在这部分进行技术假设。

模块层、层中的模块和支持该层的 class 个加载器在不再可达时有资格成为 GC'ed/unloaded。

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