2017-09-20 5 views
5

나는 module-a, module-b, module-c의 세 가지 모듈을 가지고있다. 모듈 -a와 모듈 -b는 부트 레이어에 있습니다. 모듈 용 레이어 -c 자신을 만듭니다. 모듈 -c는 인터페이스가 모듈 -a에있는 서비스의 JPMS 구현을가집니다.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의 서비스를 호출합니다. 서비스 실행이 완료된 후에는 모듈 -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 가상 머신이 시작될 때 생성됩니다.

그런 방법이 노출되면 사용자가이 계층도 시도해 볼 수 있는지 궁금합니다. 비록이 부분에서 기술적으로 가설적이 되려고 노력하고 있습니다.