JVM 經典垃圾收集器
阿新 • • 發佈:2020-12-25
> 本文部分摘自《深入理解 Java 虛擬機器第三版》
## 概述 如果說收集演算法是記憶體回收的方法論,那麼垃圾收集器就是記憶體回收的實踐者。Java 虛擬機器規範中對垃圾收集器的實現做出規定,因此不同的廠商、不同版本的虛擬機器所包含的垃圾收集器各有不同。所謂經典就是在 JDK7 Update 4 以後,JDK11 釋出以前的在 OpenJDK HotSpot 虛擬機器所包含的全部可用的垃圾收集器。儘管這些經典垃圾收集器已算不上最先進的技術,但它們都經歷了千錘百煉,基本上都是可以放心使用的垃圾收集器。各款經典垃圾收集器之間的關係如圖所示,如果兩個收集器之間存在連線,就說明它們可以搭配使用: ![](https://img2020.cnblogs.com/blog/1759254/202012/1759254-20201225105926703-2085922468.png)
## Serial Old 收集器 Serial Old 收集器是 Serial 收集器的老年代版本,同樣是一個單執行緒收集器,使用標記 - 整理演算法。這個收集器的主要供客戶端模式下的 HotSpot 虛擬機器使用。如果用在服務端模式,可能有兩種用途:一種是在 JDK5 及之前的版本中與 Parallel Scavenge 收集器搭配使用,另一種就是作為 CMS 收集器發生失敗時的後備預案。Serial Old 收集器的工作過程如圖所示: ![](https://img2020.cnblogs.com/blog/1759254/202012/1759254-20201225110014402-69650751.png)
## Parallel Old 收集器 Parallel Old 是 Parallel Scavenge 收集器的老年代版本,支援多執行緒併發收集,基於標記 - 整理演算法實現。這個收集器直到 JDK6 時才開始提供,在此之前,新生代的 Parallel Scavenge 收集器一直處於相當尷尬的狀態,因為如果新生代選擇了 Parallel Scavenge 收集器,那麼老年代除了 Serial Old 收集器以外就別無選擇,效率不高。直到 Parallel Old 收集器的出現,吞吐量優先收集器終於有了比較名副其實的搭配組合。Parallel Old 收集器的工作過程如圖所示: ![](https://img2020.cnblogs.com/blog/1759254/202012/1759254-20201225110026831-233223968.png