2017-09-20 12 views
5

Tôi có ba mô đun: module-a, module-b, module-c. Module-a và module-b nằm trong lớp khởi động. Lớp cho module-c Tôi tự tạo ra. Module-c có thực thi JPMS của dịch vụ mà giao diện trong mô đun-a.Làm thế nào để loại bỏ lớp mô-đun trong Java 9?

Đây là cách tôi tạo lớp với mô đun-c trong mô đun-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); 

Sau đó, trong dịch vụ gọi điện-mô-đun từ mô-đun c. Sau khi thực hiện dịch vụ hoàn thành, tôi không cần module-c và lớp mới được tạo ra nữa. Làm thế nào để loại bỏ nó khỏi JVM và phát hành tất cả các nguồn lực? Có đủ để làm layer = null;?

+0

Việc tạo mới 'ModuleLayer' mà không có' module-c' không hoạt động? – nullpointer

+0

Bạn có thể cập nhật câu hỏi với chính xác những gì bạn đã thử và những gì đã làm nó kết quả trong xin vui lòng. – nullpointer

+0

@nullpointer Câu hỏi của tôi có tất cả thông tin, những gì tôi làm và câu hỏi là gì. Nếu bạn không hiểu điều gì đó, hãy nói những gì bạn không hiểu. –

Trả lời

5

Lớp mô-đun, mô-đun trong lớp và trình nạp lớp hỗ trợ lớp, đủ điều kiện để được GC'ed/unloaded khi chúng không còn có thể truy cập được nữa.

Nếu bạn muốn chứng minh điều này cho chính mình, hãy tạo tham chiếu yếu cho đối tượng layer và bạn sẽ thấy tham chiếu bị xóa (và xếp hàng nếu bạn đang sử dụng hàng đợi tham chiếu) khi lớp đó được tạo thành GC.

2

Một EMPTY_LAYER trách nhiệm giải quyết tình huống sử dụng của bạn (từ một trong những ý kiến ​​về các câu hỏi, cố gắng để gán new HashSet<> như rễ) ở đây, trong đó các tham chiếu đến các lớp khác không xử lý hơn trong layer mà bạn đã tạo:

layer = ModuleLayer.empty(); 

Trả lại lớp trống. Không có mô-đun nào trong lớp trống. Nó không có cha mẹ.


Trên suy nghĩ của việc có thể để loại bỏ một lớp một cách rõ ràng hình JVM, tôi sẽ không thể mong đợi như một API tiếp xúc công khai kể từ khi một JVM là phải có ít nhất một lớp không trống, lớp khởi động, được tạo khi máy ảo Java được khởi động.

Và nếu phương pháp như vậy được hiển thị, tôi tự hỏi liệu người dùng có thể thử và loại bỏ lớp này không. Mặc dù tôi đang cố gắng giả thiết về mặt kỹ thuật ở phần này.

Các vấn đề liên quan