GC在堆和方法區的記憶體回收
阿新 • • 發佈:2019-01-01
堆物件的存活
判斷物件是否存活,主流實現是可達性分析。
可達性演算法的基本思路,通過一系列為“GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈(Reference Chain), 當一個物件到GC Roots 沒有任何引用鏈相連時,相當於圖論的從GC Roots不可達,則這個物件不可用。
- 引用型別
- 強引用
只要強引用還存在,垃圾收集器永遠不會收掉被引用的物件 - 軟引用
在系統將要發生記憶體異常之前,將會把這些物件列進回收範圍之中進行第二次回收。 - 弱引用
被弱引用關聯的物件只能生存道下一次垃圾收集發生之前。 - 虛引用
一個物件是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個物件的例項。
- 強引用
物件的回收過程
當物件沒有覆蓋finalize方法,或者fialize已經被虛擬機器呼叫過, 則是沒必須要執行
回收方法區
方法區即為永久代,主要回收兩部分內容:廢棄常量和無用類。
滿足以下3個條件的類稱之為無用類
- 該類所所有的物件例項已經被回收,也就是java堆中不存在該類的任何例項
- 載入該類的ClassLoader已經被回收
- 該類對應的java.lang.Class物件沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。
在大量使用反射、動態代理、CGLib等ByteCode框架、動態生成JSP以及OSGI這類頻繁自定義ClassLoader的場景都需要虛擬機器具備類解除安裝的功能,以保證永久帶不會溢位。