1. 程式人生 > >jvm GC回收演算法

jvm GC回收演算法

如何判斷物件已死
  • 引用演算法
對物件中新增一個引用計數器,每當有一個地方引用它,引用計數器加1。任何時候物件的引用計數器為0,則表示物件不會再被使用,可以回收該部分記憶體 弊端:若存在兩個物件,A,B。A引用了B,B引用了A。導致的結果是AB的引用計數器永遠不為0,永遠無法回收
  • 根搜尋演算法(jvm使用的演算法)
通過名為“GC Roots”的物件作為起始點,想下搜尋。搜尋路徑稱為引用鏈。當一個物件到GC Roots沒有任何引用鏈相連,則證明物件是不可用的。
  • GC標記回收機制
在根搜尋演算法中,不可達的物件,也不會被立即回收。可稱之為“待行刑”階段。因為一個不可達物件被回收至少要經歷兩次標記過程。 一個物件在根搜尋演算法中,不可達,則進行一次標記,並且進行一次篩選。 篩選條件:此物件是否有必要執行finalize()方法。 若物件沒有覆蓋finalize()方法,或者finalize()已被虛擬機器呼叫過,虛擬機器則認為這兩種情況都是“沒有必要執行” 若物件被判斷有必要執行finalize方法,則物件會被暫時放在一個F-Queue的佇列中,並在稍後由虛擬機器建立一條低優先順序的執行緒去執行。 finalize方法是物件逃脫回收的最後一次機會。即在finalize方法中重新引用一次this物件即可,這樣虛擬機器在下一次標記的時候,又會把該物件移出“即將回收集合”