瞭解JVM垃圾回收器

瞭解JVM垃圾回收器

1. 7種垃圾回收器

種類 回收器名字
串行 Serial ,Serial Old
並行 ParNew,Parallel SCavenge,Parallel Old
併發: CMS,G1

按照分區的劃分

Young G : Serial ,Parallel SCavenge,ParNew,
Old G: Serial Old,Parallel Old,CMS
G1是兩個都可以,

可以利用-XX:+PrintCommandLineFlags -XX:+UseXXXGC 這個可以設置項目利用哪個垃圾回收器並打印看看

所有的垃圾回收器都會Stop the World,就是在回收的時候暫停其它線程除垃圾回收線程外

2. Serial與Serial Old

-XX:+UseSerialGC 切換爲Serial回收器

他們的關係一般是搭配的,新生代用Serial,老年代用Serial Old

優勢 單線程下簡單高效,沒有線程開銷,專心垃圾回收
Serial 單線程下性能更好,而且是採用的複製算法串行回收
Serial Old 也是單線程下比較好,但是是老年代回收器,採用的標記壓縮算法
特點 只使用一個CPU或一條收集線程去回收垃圾,更重要是回收時必須暫停其它所有的工作,直到收集結束
場景 適用於Client 的jvm佔用不大,單線程
串行 兩者都是

3. ParNew 新生代回收器

-XX:+UseParNewGC 切換爲ParNew回收器

jdk9以後都沒有搭配的老年代回收器所以就退役了,jdk9之前可以和CMS或者Serial Old搭配

它是並行的,對於新生代,回收次數頻繁,使用並行方式高效
對於老年代,回收次數少,使用串行方式節省資源,因爲並行的話會切換上下文,不過性能好的話多核也可以並行

採用的複製算法並行回收,採用stop the world的方式內存回收

4. Parallel Scavenge和Parallel Old

java8默認是這兩個回收器

二者可以相互激活 -XX:+UseParalleGC 或者 -XX:+UseParallOldeGC

-XX:+ParallelGCThreads 設置年輕代並行回收線程數,最好與cpu個數相等,多了到時候線程切換上下文耗時,少了又浪費資源

注重吞吐量!!!

並行的 注重吞吐量,主要是可以自適應調節吞吐量(調節分代的大小,Eden和倖存的比例 ,晉升老年代的年齡),這也是和ParNew不同的地方

這兩個回收器一般出現都是一套,新生代用Parallel Scavenge(複製算法),老年代用Parallel Old(標記壓縮算法)

適用場景

不適合頻繁交互的任務,適合後臺運行比如批處理,大量計算,訂單處理等的時候

爲什麼老年代不用Serial,串行效率不是更高

因爲它注重吞吐量,高性能的服務器還是用並行的不用串行的Serial,不然浪費資源

5. CMS回收器

-XX:+UseConcMarkSweepGC 切換CMS回收器 JDK14已經移除了

注重響應時間!!!

併發的老年代的回收器採用標記-清除算法用戶線程和垃圾回收同時執行,對響應時間上更好,適合與用戶交互,縮短stop the world的時間

有五個過程 初始標記(stop)-併發標記-重新標記(stop短)-併發清除-重置線程

我們來講一下它的過程:

  1. 初始標記:所有用戶線程stop 然後標記出可達性對象,馬上恢復用戶,速度很快
  2. 併發標記:把可達性對象遍歷根節點,但不stop,跟用戶線程併發運行,耗時很長
  3. 重新標記:修正併發標記,因爲用戶運行期間對象可能會變動爲垃圾,垃圾也可能被引用,先stop用戶活動線程,不然邊活動產生垃圾很難標記,時間很短
  4. 併發清除:清理一些標記階段判定的垃圾,釋放內存,跟存活對象無關係所以不用stop the world
  5. 重置線程

初始標記和重新標記都要stop the world,但是時間很短,幾乎不影響,從上面我們就可以看出大部分過程都是和用戶線程一起執行,只有短暫的stop這就是低延遲

在這個過程中基本沒有中斷,需要保證可用內存大小,內存到一定量就開始回收,但是如果內存不夠CMS運行的時候就啓動備用方法改Serial Old用標記清理stop收集,效率特別慢了

爲什麼不改成標記壓縮算法,還能整理內存空間

因爲在併發清除的過程,用戶程序是併發的所以不能改變內存地址,會出問題標記整理更適合stop the world

好處 低延遲,併發收集
缺點 1. 標記清除會產生內存碎片用戶線程內存不足會提前重GC 2. 會佔用一部分資源導致用戶線程變慢,總吞吐量有所降低 3. 無法清理浮動垃圾,在併發標記的時候用戶線程運行過程誕生新垃圾,修正標記只是對之前的可達性對象修正,新的垃圾沒被標記到,

6. G1回收器 JDK9默認回收器

特點是:分區域分代,年輕代和老年代兼顧

並行回收器,分出了很多區域,根據允許的收集時間,優先回收價值最大的區域
側重點是垃圾多的區域,垃圾優先

年輕代(Eden-To-From)佔1/3- 老年代佔2/3

年輕代裏面又是 8/10:1/10:1/10

優勢:

  1. 並行與併發
    並行多個垃圾回收線程同時回收垃圾,STW
  2. 分代收集
    邏輯上分成EDEN和Survivor,邏輯上區域包括年輕代和老年代
  3. 空間整合
    可以在若干次GC後進行一個標記整理
  4. 可預測的停頓時間模型
    縮小回收範圍,貪心法,對垃圾堆價值最大的先回收
    保證了有限時間回收了最大的垃圾

**缺點:**垃圾回收過程內存佔用比CMS高,運行時額外負載比CMS高
STW加多個回收線程,消耗大,所以小內存還是CMS好

三種回收模式:輕GC,重GC,MIXGC

使用場景是大內存和多處理器的機器
G1中會創一個H區來存放短時存在的大對象,一個放不下就找連續的H區

年輕代的Eden用光時會輕GC給倖存區,當活下來的年齡達到15次後就會移動到老年區,堆內存達到45的時候重GC一次

RemberSet

因爲對象可能被其它區的對象引用,但是回收不可能全盤掃描來判斷對象的存活,RemeberSet防止全盤掃描
,每個區都有RemeberSet,會去記錄對象被哪些區的對象引用,如果是其它區的就用CardTable記錄到RSet,將垃圾回收範圍擴大一個Rset

更多相關了解可以看jvm知識

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章