JAVA常見垃圾回收器介紹
阿新 • • 發佈:2022-01-14
1、垃圾定義
2、如何確定垃圾
2.1 引用計數法
在 Java 中,引用和物件是有關聯的。如果要操作物件則必須用引用進行。因此,很顯然一個簡單 的辦法是通過引用計數來判斷一個物件是否可以回收。簡單說,即一個物件如果沒有任何與之關 聯的引用,即他們的引用計數都不為 0,則說明物件不太可能再被用到,那麼這個物件就是可回收 物件2.2
為了解決引用計數法的迴圈引用問題,Java 使用了可達性分析的方法。通過一系列的“GC roots” 物件作為起點搜尋。如果在“GC roots”和一個物件之間沒有可達路徑,則稱該物件是不可達的。13/04/2018 Page 27 of 283 要注意的是,不可達物件不等價於可回收物件,不可達物件變為可回收物件至少要經過兩次標記 過程。兩次標記後仍然是可回收物件,則將面臨回收 3、垃圾回收演算法 標記清除演算法(Mark-Sweep) 找出需要回收的記憶體,直接清除 缺點:會產生很多記憶體碎片,後續可能發生大物件不能找到可利用空間的問題。 複製演算法(copying) 簡介:為了解決 Mark-Sweep 演算法記憶體碎片化的缺陷而被提出的演算法。按記憶體容量將記憶體劃分為等大小 的兩塊。每次只使用其中一塊,當這一塊記憶體滿後將尚存活的物件複製到另一塊上去,把已使用 的記憶體清掉 優缺點:Serial:新生代,回收時會停止應用程式執行緒,且是單執行緒
Parallel Scavenge:新生代,回收時會停止應用程式執行緒,但是多執行緒
ParNew:配合年老代的CMS使用
Serial Od:年老代,回收時會停止應用程式執行緒,且是單執行緒
Parallel Old:年老代,回收時會停止應用程式執行緒,但是多執行緒
CMS(Concurrent mark sweep():年老代,不會停止使用者執行緒
其最主要目標是獲取最短垃圾
回收停頓時間,和其他年老代使用標記-整理演算法不同,它使用多執行緒的標記-清除演算法。 最短的垃圾收集停頓時間可以為互動比較高的程式提高使用者體驗 G1(Garbage first) 垃圾收集器是目前垃圾收集器理論發展的最前沿成果,相比與 CMS 收集器,G1 收 集器兩個最突出的改進是: 1. 基於標記-整理演算法,不產生記憶體碎片。 2. 可以非常精確控制停頓時間,在不犧牲吞吐量前提下,實現低停頓垃圾回收。 G1 收集器避免全區域垃圾收集,它把堆記憶體劃分為大小固定的幾個獨立區域,並且跟蹤這些區域 的垃圾收集進度,同時在後臺維護一個優先順序列表,每次根據所允許的收集時間,優先回收垃圾 最多的區域。區域劃分和優先順序區域回收機制,確保 G1 收集器可以在有限時間獲得最高的垃圾收 集效率。 ZGC