1. 程式人生 > >JVM從零開始(三)-常用垃圾回收器及原理

JVM從零開始(三)-常用垃圾回收器及原理

一、垃圾回收器有哪些

由於有些年輕代和老年代回收器無法相容,一般使用都是用以下四個組合。

檢視命令

java -XX:+PrintCommandLineFlags -version

第一個組合:Serial + Serial Old

Serial作為年輕代回收器和Serial Old垃圾回收器(JDK1.3版本之前)作為老年代回收器。在JDK1.3版本之前是唯一選擇,現在基本不用,因為是單程序收集器,沒有發揮出現在多核並行處理的優勢。

第二個組合:ParNew + CMS

ParNew作為年輕代回收器,CMS作為老年代回收器,一般需要手動指定,因為現在jdk7,8預設不是使用這個策略。而是使用的下面的Parallel Scavenge + Parallel Old。其基本收集原理和下面的Parallel Scavenge + Parallel Old沒有區別,區別在於Parallel Scavenge和 Parallel Old有自適應調節策略,直接可以適應最大吞吐量。但忽略了停頓時間,不適用於要求使用者體驗的場景,個別請求可能等待時間較長。而ParNew + CMS主要場景是注重控制單次回收停頓時間。

第三個組合:Parallel Scavenge + Parallel Old

JDK6版本之後引入,Parallel Scavenge作為年輕代回收器,Parallel Old作為老年代回收器,在JDK6之前,Parallel Scavenge只能適配Serial Old,現在是JDK7,JDK8的預設組合。特點上面說了就是適應最大吞吐量。

第四個組合:G1回收器

G1回收器,JDK7出現,JDK9之後的預設回收器,老年代和年輕代都可以回收,特點是直接對停頓時間進行設定。

二、各回收器的細節原理

上一篇就介紹了垃圾回收機制,但是沒有針對各個回收器進行區別,實際上上一篇文章就是基於ParNew + CMS來介紹的,其他垃圾回收器包括Serial + Serial Old,Parallel Scavenge + Parallel Old基本上是相同的機制。只不過Serial + Serial Old是單核,並且全程阻塞使用者執行緒,Scavenge + Parallel Old更注重吞吐量,自適應調節,不需要手動指定新生代的大小,Eden和Survivor區的比例,晉升老年代物件等細節引數。但G1會稍稍有點不一樣。

這裡主要分兩塊來講,分別以ParNew + CMS和G1回收器來介紹下其中在第二篇文章沒有提到的細節以及G1與其的區別。

睡覺,明天繼續

ParNew + CMS 回收機制