1. 程式人生 > >GC在堆和方法區的記憶體回收

GC在堆和方法區的記憶體回收

堆物件的存活

判斷物件是否存活,主流實現是可達性分析。 

可達性演算法的基本思路,通過一系列為“GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈(Reference Chain), 當一個物件到GC Roots 沒有任何引用鏈相連時,相當於圖論的從GC Roots不可達,則這個物件不可用。

  • 引用型別
    • 強引用
      只要強引用還存在,垃圾收集器永遠不會收掉被引用的物件
    • 軟引用
      在系統將要發生記憶體異常之前,將會把這些物件列進回收範圍之中進行第二次回收。
    • 弱引用
      被弱引用關聯的物件只能生存道下一次垃圾收集發生之前。
    • 虛引用
      一個物件是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個物件的例項。

物件的回收過程

當物件沒有覆蓋finalize方法,或者fialize已經被虛擬機器呼叫過, 則是沒必須要執行

Created with Raphaël 2.1.0分析物件物件不可達需要執行finalize方法放入F-Queue佇列,由Finalizer執行緒去執行它回收這個物件存活(不回收)yesnoyesno

回收方法區

 方法區即為永久代,主要回收兩部分內容:廢棄常量和無用類。

滿足以下3個條件的類稱之為無用類

  • 該類所所有的物件例項已經被回收,也就是java堆中不存在該類的任何例項
  • 載入該類的ClassLoader已經被回收
  • 該類對應的java.lang.Class物件沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

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