2017-09-20 48 views
5

我有三個模塊:module-a,module-b,module-c。模塊-a和模塊-b處於引導層。爲模塊-C創建我自己。 Module-c具有JPMS實現的接口在模塊-a中的服務。如何刪除Java 9中的模塊層?

這是我在模塊-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;足夠嗎?

+0

沒有'module-c'創建一個新的'ModuleLayer'不行嗎? – nullpointer

+0

你能否更新這個問題,你究竟試過了什麼,請問它是什麼結果。 – nullpointer

+0

@nullpointer我的問題包含了所有的信息,我做了什麼以及有什麼問題。如果你不明白,請說出你不明白的地方。 –

回答

5

模塊層,圖層中的模塊和支持圖層的類加載程序在不再可到達時可以進行GC /卸載。

如果你想向自己證明這一點,那麼創建一個對layer對象的弱引用,你應該看到當該層被GC化時,引用被清除(並且如果你正在使用引用隊列,則排隊)。

2

EMPTY_LAYER應解決您的用例(從問題的意見之一,嘗試指派new HashSet<>如根)在這裏,其中以無layer內的多個處理其他層引用您創建:

layer = ModuleLayer.empty(); 

返回空白圖層。空白層沒有模塊。它 沒有父母。


開始能去除一層明確地形成了JVM的想法,我就沒有可能指望這樣,因爲一個JVM公開曝光的API應該至少有一個非空層,該引導層,這是在Java虛擬機啓動時創建的。

如果這種方法暴露出來,我想知道用戶是否也可以嘗試並刪除此圖層。儘管我試圖在這方面進行技術上的假設。