2017-09-20 3 views
5

私はモジュールa、モジュールb、モジュールcの3つのモジュールを持っています。モジュール-aとモジュール-bはブートレイヤーにあります。モジュール-cのレイヤー自分自身を作成し​​ます。モジュール-cは、インタフェースがモジュール-a内にあるサービスのJPMS実装を有する。Java 9のモジュールレイヤーを削除するには?

これは、モジュール-bでモジュール-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からサービスを呼び出します。サービスの実行が完了した後、私はモジュール-cと新しいレイヤーを作成する必要はありません。 JVMから削除してすべてのリソースを解放するにはどうすればいいですか? layer = null;を実行すれば十分ですか?

+0

'module-c'を付けずに新しい' ModuleLayer'を作成することはできませんか? – nullpointer

+0

質問を正確に試してみることができますか?その結果はどうでしたか。 – nullpointer

+0

@nullpointer私の質問には、私が何をしているのか、何について質問があるのか​​、すべての情報があります。あなたが何かを理解していないなら、あなたが理解していないことを言ってください。 –

答えて

5

モジュールレイヤー、レイヤー内のモジュール、およびレイヤーをサポートするクラスローダーは、到達できなくなった時点でGC'ed/unloadedすることができます。

これを自分自身に証明したい場合はlayerオブジェクトへの弱い参照を作成し、レイヤがGCされたときに参照がクリアされている(参照キューを使用している場合はキューに入れられている)ことを確認する必要があります。

2

EMPTY_LAYERは、他の層への参照はもうあなたが作成したlayer内で処理され、ここで(ルーツとしてnew HashSet<>を代入しようとしない、質問のコメントのいずれかから)あなたのユースケースを解決しなければならない。

layer = ModuleLayer.empty(); 

空のレイヤーを返します。空のレイヤーにモジュールはありません。それは に両親がいません。明示的にJVMを形成する層を除去することができるという考えに


JVMは、少なくとも一つの非空の層を持っていることになっていることから、私はおそらく一般に公開、そのようなAPIを期待していません、 ブート層これは、Java仮想マシンの起動時に作成されます。

このような方法が公開されている場合、ユーザーがこの層も試して削除できるかどうかは疑問です。私はこの部分について技術的に仮定しようとしていますが。

関連する問題