這個問題在這里已經有了答案: Java 中何時以及如何收集類垃圾? (1 個回答) 昨天關門。
我的問題是型別的物件java.lang.Class
是否曾經被垃圾收集。例子:
WeakReference<Class<Object>> ref = new WeakReference<>(Object.class);
assertEquals(ref.get(),null);
這有可能永遠斷言為真嗎?對 java.lang.Class 物件的參考會變得無效嗎?
uj5u.com熱心網友回復:
Ajava.lang.Class
與class
它所代表的有關。實體的垃圾收集Class
意味著卸載類,這是可能的,但僅在某些情況下。對于一個普通的類或介面,它不僅要求Class
物件而且它的定義ClassLoader
實體變得不可訪問,這反過來又要求這個特定類加載器的所有類都是不可訪問的。
這在第 12.7 節的規范中得到了解決。卸載類和介面:
Java 編程語言的實作可以卸載類。
當且僅當垃圾收集器可以回收其定義的類加載器時,才能卸載類或介面,如§12.6中所述。
引導加載程式加載的類和介面可能不會被卸載。
所有內置類加載器都不會變得不可訪問。
但是還有defineHiddenClass
一種方法允許定義特殊的“隱藏”類,即使它們的定義加載器是可訪問的(除非已指定STRONG
選項),這些類也可能會被垃圾收集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491510.html