1. 程式人生 > >JVM:方法區可以GC嗎?

JVM:方法區可以GC嗎?

方法區和堆一樣,都是執行緒共享的記憶體區域,被用於儲存已被虛擬機器載入的類資訊、即時編譯後的程式碼、靜態變數和常量等資料。

 

根據Java虛擬機器規範的規定,方法區無法滿足記憶體分配需求時,也會丟擲OutOfMemoryError異常,雖然規範規定虛擬機器可以不實現垃圾收集,因為和堆的垃圾回收效率相比,方法區的回收效率實在太低,但是此部分記憶體區域也是可以被回收的。

 

方法區的垃圾回收主要有兩種,分別是對廢棄常量的回收和對無用類的回收。

 

當一個常量物件不再任何地方被引用的時候,則被標記為廢棄常量,這個常量可以被回收。

 

方法區中的類需要同時滿足以下三個條件才能被標記為無用的類:

 

1.Java堆中不存在該類的任何例項物件;

 

2.載入該類的類載入器已經被回收

 

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

當滿足上述三個條件的類才可以被回收,但是並不是一定會被回收,需要引數進行控制,例如HotSpot虛擬機器提供了-Xnoclassgc引數進行控制是否回收。