1. 程式人生 > 其它 >JAVA常見垃圾回收器介紹

JAVA常見垃圾回收器介紹

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 演算法記憶體碎片化的缺陷而被提出的演算法。按記憶體容量將記憶體劃分為等大小 的兩塊。每次只使用其中一塊,當這一塊記憶體滿後將尚存活的物件複製到另一塊上去,把已使用 的記憶體清掉   優缺點:
這種演算法雖然實現簡單,記憶體效率高,不易產生碎片,但是最大的問題是可用記憶體被壓縮到了原 本的一半。且存活物件增多的話,Copying 演算法的效率會大大降低 標記整理演算法(Mark-Compact)   結合了以上兩個演算法,為了避免缺陷而提出。標記階段和 Mark-Sweep 演算法相同,標記後不是清 理物件,而是將存活物件移向記憶體的一端。然後清除端邊界外的物件 4、常見垃圾回收器

Serial:新生代,回收時會停止應用程式執行緒,且是單執行緒

Parallel Scavenge:新生代,回收時會停止應用程式執行緒,但是多執行緒

ParNew:配合年老代的CMS使用

Serial Od:年老代,回收時會停止應用程式執行緒,且是單執行緒

Parallel Old:年老代,回收時會停止應用程式執行緒,但是多執行緒

CMS(Concurrent mark sweep():年老代,不會停止使用者執行緒

  其最主要目標是獲取最短垃圾

回收停頓時間,和其他年老代使用標記-整理演算法不同,它使用多執行緒的標記-清除演算法。 最短的垃圾收集停頓時間可以為互動比較高的程式提高使用者體驗 G1(Garbage first)    垃圾收集器是目前垃圾收集器理論發展的最前沿成果,相比與 CMS 收集器,G1 收   集器兩個最突出的改進是:   1. 基於標記-整理演算法,不產生記憶體碎片。   2. 可以非常精確控制停頓時間,在不犧牲吞吐量前提下,實現低停頓垃圾回收。   G1 收集器避免全區域垃圾收集,它把堆記憶體劃分為大小固定的幾個獨立區域,並且跟蹤這些區域   的垃圾收集進度,同時在後臺維護一個優先順序列表,每次根據所允許的收集時間,優先回收垃圾   最多的區域。區域劃分和優先順序區域回收機制,確保 G1 收集器可以在有限時間獲得最高的垃圾收   集效率。 ZGC