JVM - 方法區(永久代)的垃圾回收

莫負少年時發表於2018-11-17

方法區在HotSpot中也被成為永久代,該部分垃圾收集的效率比較低。

永久代主要針對廢棄常量和無用的類兩部分內容進行回收。

廢棄常量的回收:以常量池中字面量的回收為例,在當前系統中沒有任何地方引用某個字面量時,那麼如果此時發生垃圾回收,而且必要的話,該字面常量將會被回收掉。常量池中的其他類(介面),方法,欄位的符號引用的回收與此類似。

無用的類:同時滿足下面三個條件的類,才可以被回收,但是僅僅是可以,並非不使用了必然會回收,受虛擬機器引數控制。

1. 該類所有的例項都已經被回收,也就是Java堆中不存在該類的任何例項。

2. 載入類的ClassLoader已經被回收。

3. 該類對應的java.lang.Class物件沒有在任何地方被引用,無法在任何地方通過發射訪問該類的方法。


在大量使用反射、動態代CGLib等ByteCode框架、動態生成JSP以及OSGI這類頻繁自定義ClassLoader的場景都需要虛擬機器具備類解除安裝的功能,以保證永久代不會溢位。

相關文章