7

我有三个模块:模块-a、模块-b、模块-c。模块-a 和模块-b 在引导层。我自己创建的模块-c 层。Module-c 具有该服务的 JPMS 实现,该接口位于 module-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;

4

2 回答 2

5

模块层、层中的模块和支持该层的类加载器在不再可访问时有资格被 GC'ed/unloaded。

如果您想向自己证明这一点,请创建对该layer对象的弱引用,并且您应该会看到该引用已被清除(如果您使用的是引用队列,则该引用已排入队列)当该层被 GC 处理时。

于 2017-09-20T11:13:18.343 回答
1

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

layer = ModuleLayer.empty();

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


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

如果这种方法暴露出来,我想知道用户是否可以尝试删除这一层。尽管我试图在这方面进行技术假设。

于 2017-09-20T10:40:17.790 回答