JVM學習筆記——垃圾回收篇( 五 )

垃圾回收器前面我們已經介紹了垃圾回收機制,現在我們來介紹常用的垃圾回收器
STW概念我們在正式講解垃圾回收器之前,我們先來回顧一個概念STW:

  • STW即Stop The World,意思是暫停所有進程處理
  • 因為我們在進行垃圾處理時,會涉及到地址空間的整合(標記整理法) , 這時所有CPU都需要停止操作
串行垃圾回收器我們首先來介紹串行垃圾回收器的特點:
  • 單線程
  • 適用于堆內存較小,適合單人電腦
我們給出串行垃圾回收器的展示圖:
JVM學習筆記——垃圾回收篇

文章插圖
我們所需配置:
// 設置 新生代回收方法復制 老年代回收方法為標記整理法-XX:+UseSerialGC = Serial + SerialOld我們來簡單解釋一下:
  • 串行操作屬于單核CPU處理
  • 我們在處理該CPU的垃圾回收時,只有該線程的CPU進行操作
  • 但同時老年代采用標記整理法會涉及到內存地址重新規劃 , 所以其他CPU也需要暫停操作,即STW
吞吐量優先垃圾回收器我們首先來介紹吞吐量優先垃圾回收器的特點:
  • 多線程
  • 適用于堆內存較大,需要多核CPU
  • 讓單位時間內,STW時間最短,例如每次STW0.2秒 , 但執行兩次,共用0.4s(總時間最短)
我們給出吞吐量優先垃圾回收器的展示圖:
JVM學習筆記——垃圾回收篇

文章插圖
我們所需配置:
// 設置垃圾回收器方法XX:+UseParallelGC ~ -XX:+UseParallelOldGC// 自適應新生代晉升老年代的閾值處理-XX:+UseAdaptiveSizePolicy// 設置垃圾回收時間占總時間的比例(與-XX:MaxGCPauseMillis=ms沖突)-XX:GCTimeRatio=ratio// 設置最大STW時間(與-XX:GCTimeRatio=ratio沖突)-XX:MaxGCPauseMillis=ms// 設置最大同時進行CPU個數-XX:ParallelGCThreads=n我們來簡單解釋一下:
  • 吞吐量優先垃圾回收器是多核CPU處理回收器
  • 當一個進程發生垃圾回收時,我們會將所有CPU都用于垃圾回收 , 這時CPU利用率為100%
響應時間優先垃圾回收器我們首先來介紹響應時間優先垃圾回收器的特點:
  • 多線程
  • 適用于堆內存較大,需要多核CPU
  • 讓單次STW時間最短,例如每次STW0.1秒,但執行五次,共用0.5s(單次時間最短)
我們給出響應時間優先垃圾回收器的展示圖:
JVM學習筆記——垃圾回收篇

文章插圖
我們所需配置:
// +UseConcMarkSweepGC:設置并發標記清除算法 , 允許用戶進程單獨進行,但部分時間還需要阻塞// -XX:+UseParNewGC:設置新生代算法,// SerialOld:當老年代并發失敗,采用單線程方法-XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld// -XX:ParallelGCThreads=n:并行數設置為n// -XX:ConcGCThreads=threads:并發線程最好設置為CPU的1/4個數 , 相當于只有1/4個CPU在處理垃圾回收-XX:ParallelGCThreads=n ~ -XX:ConcGCThreads=threads// 預留空間(因為并發清理時其他進程可能會產生一些垃圾,這些垃圾目前無法處理,我們需要預留一定空間進行儲存)-XX:CMSInitiatingOccupancyFraction=percent// 我們在重新標記階段前,先對新生代進行垃圾回收,節省其標記量-XX:+CMSScavengeBeforeRemark我們來簡單解釋一下:
  • 響應時間優先垃圾回收器是多核CPU處理回收器
  • 首先我們的CPU1進行初始標記 , 其他進程阻塞,僅標記一些Root對象(時間短)
  • 然后我們CPU1進行并發標記,其他進程繼續運行,這時用來標記所有的垃圾回收對象(時間長)
  • 然后由于我們的并發標記可能會導致一些內存混亂 , 所以我們將所有CPU需要進行重新標記(時間短)
  • 最后只需要對CPU1進行并發清理即可 , 其他進程繼續運行
G1垃圾回收器下面我們將會針對jdk1.9默認垃圾回收器做一個詳細的介紹
G1垃圾回收器簡介首先我們先來簡單介紹一下G1垃圾回收器:
  • G1回收器:Garbage First
  • 在2017成為JDK9的默認垃圾回收器
下面我們來介紹G1垃圾回收器的特點:
  • 同時注重吞吐量和低延遲,默認的暫停目標是200ms
  • 超大堆內存,將堆劃分為多個大小相等的Region
  • 整體上是標記整理法,但兩個區域之間是復制算法
相關JVM參數: