1. 程式人生 > >方法區的垃圾回收

方法區的垃圾回收

很多人以為方法區(或者HotSopt VM中的永久代)是沒有垃圾收集的,Java虛擬機器規範中確實說過可以不要求虛擬機器在方法區實現垃圾收集,而且價效比一般較低,在對的新生代生一般能回收70%~95%的空間,而永久代遠低於此。

永久代的垃圾手機主要回收兩部分內容:廢棄常量無用的類。 回收廢棄常量與回收Java堆中的物件非常相似。以常量池中字面量的回收為例,若字串“abc”已經進入常量池中,但當前系統沒有任何String物件引用常量池中的“abc”常量,也沒有其他地方引用該字面量,若發生記憶體回收,且必要的話,該“abc”就會被系統清理出常量池。常量池中其他的類(介面)、方法、欄位的符號引用與此類似。

無用的類需要滿足3個條件:

(1)該類所有的例項都已經被回收,即Java堆中不存在該類的任何例項;
(2)載入該類的ClassLoader已經被回收;
(3)該類對應的java.lang.Class物件沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

虛擬機器可以對滿足上述3個條件的無用類進行回收,此處僅僅是“可以”,而並不是和物件一樣(不使用了就必然回收)