JVM總結-垃圾收集器與記憶體分配策略
阿新 • • 發佈:2019-04-10
垃圾收集器
需要回收的物件例項
垃圾收集器在對堆進行回收時,首先要判斷物件是否還存活。
判斷物件是否存貨的演算法:
1、引用計數器(一般JVM都不用這個演算法)
給物件新增一個引用計數器,每當一個地方引用他,程式計數器就加一,但引用失效時程式計數器減一,計數器為0的物件就是不再使用的物件。
優點:實現簡單,判定效率高
缺點:很難解決物件之間迴圈引用的問題(例如兩個物件互相引用,這樣程式技術器永遠不會為0)
2、可達性分析演算法
演算法的基本思想思路是通過一系列成為“GC ROOTS”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈,當一個物件到GC ROOTS沒有任何引用鏈相連說明這個物件是不可用的。
JAVA中可以作為GC ROOTS的物件
- 虛擬機器棧中的引用物件
- 方法區中的靜態屬性引用物件
- 方法區中的常量引用物件
- 本地方法中的JNI引用的物件
判定為不可達物件被標記一次並進行篩選,刷選條件為此物件是否有必要執行finalize()方法。當物件沒有覆蓋finalize()方法或者虛擬機器已經呼叫過這個方法,都視為沒有必要執行。
視為有必要執行,那麼這個物件會被放到一個F_Queue的佇列中,由虛擬機器建立、優先順序低的finalizer執行緒去執行。(並不承諾等待它結束,避免發生死迴圈或者很慢造成其他物件等待,導致記憶體回收系統崩潰)
GC對F_QUEUE佇列中的物件進行第二次標記,如果沒有重新與引用鏈上的物件關聯則被真正回收,否則將被移除“即將回收的集合”。
方法區回