2017-09-20 49 views
5

Mam trzy moduły: moduł-a, moduł-b, moduł-c. Moduł-a i moduł-b znajdują się w warstwie startowej. Warstwa dla modułu-c Tworzę siebie. Moduł-c ma implementację JPMS usługi, której interfejs znajduje się w module-a.Jak usunąć warstwę modułów w Javie 9?

W ten sposób tworzę warstwę za pomocą modułu c w module-b.

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

Następnie w module-b wywołuję usługę z modułu c. Po zakończeniu realizacji usługi nie potrzebuję już więcej modułów-c i nowoutworzonej warstwy. Jak usunąć go z JVM i zwolnić wszystkie zasoby? Czy wystarczy zrobić layer = null;?

+0

Czy tworzenie nowej 'ModuleLayer' bez' module-c' nie działa? – nullpointer

+0

Czy możesz zaktualizować pytanie tym, co dokładnie wypróbowałeś i co spowodowało. – nullpointer

+0

@nullpointer Moje pytanie zawiera wszystkie informacje, co robię i na czym polega pytanie. Jeśli czegoś nie rozumiesz, powiedz to, czego nie rozumiesz. –

Odpowiedz

5

Warstwa modułów, moduły w warstwie i programy ładujące klasy obsługujące warstwę kwalifikują się do GC/wyładowania, gdy nie są już dostępne.

Jeśli chcesz to udowodnić sobie, a następnie utworzyć słabe odniesienie do obiektu layer i powinieneś zobaczyć, że odniesienie jest wyczyszczone (i kolejkowane, jeśli używasz kolejki referencyjnej), gdy warstwa jest GC'ed.

2

EMPTY_LAYER powinien rozwiązać przypadków użycia (z jednym z komentarzy na pytanie, próbując przypisać new HashSet<> jako korzeniami) tutaj, przy czym odniesienia do innych warstw nie więcej obsłużonych w layer który został utworzony:

layer = ModuleLayer.empty(); 

Powoduje zwrócenie pustej warstwy. W pustej warstwie nie ma modułów. To nie ma rodziców.


Na myśl jest w stanie usunąć warstwę wyraźnie tworzą JVM, I prawdopodobnie nie oczekiwać takiego API narażone publicznie ponieważ JVM ma mieć co najmniej jeden niepusty warstwie, warstwa startowa, która jest tworzona po uruchomieniu wirtualnej maszyny Java.

A jeśli taka metoda zostanie ujawniona, zastanawiam się, czy użytkownicy mogą spróbować usunąć tę warstwę również. Chociaż próbuję być technicznie hipotetyczny w tej części.