【JVM】程式設計師進階JVM(三)——7大 垃圾回收算器

AresCarry發表於2018-06-18

一、前言

      前幾篇部落格,小編向大家介紹了JVM的一些基本知識,包括JVM的執行時的記憶體結構,以及JVM是通過哪些演算法回收物件,Jvm是通過哪些演算法回收來判斷出某些物件是可以回收的。而這些回收的工作都是垃圾回收器來完成的。

      在這篇部落格中,小編就從虛擬到現實,向大家介紹幾款垃圾回收器。

二、垃圾回收器巨集觀介紹

      學習回收器,思維導圖先行:

      這裡呢,我們討論的是JDK1.7 以後的HotSpot虛擬機器中的垃圾收集器,主要是因為在JDK1.7 以後新增了G1回收器。

這裡寫圖片描述

      在HotSpot的JVM虛擬機器中,有7種垃圾回收器。這其中垃圾回收器也是從一代一代改進來的。當然垃圾回收處理的STW的停頓時間也越來越短。效率越來越高。因為我們的堆中,分了年輕代和老年代。每一個部分中用的記憶體收集演算法是不一樣的。針對不同的回收演算法就設定了不同的垃圾收集器。

這裡寫圖片描述

三、各種垃圾收集器


3.1 Serial

      新生代收集器,可以說Serial是最基礎的收集器。

      看到Serial就經常相當序列化介面Serializable。雖然這兩個之間沒有任何關係,就是名字相似罷了。

      再說Serial收集器,有下面的特點:

  • 單執行緒,當他收集記憶體的時候,所有其他的執行緒都要等待,直到他完成。

  • 複製演算法

ParNew

      新生代收集器,可以說ParNew是Serial的一個多執行緒版本。

      特點:

  • 多執行緒

  • 複製演算法

  • 回收的時候暫停所有使用者的執行緒

  • 只能配合CMS工作

Parallel Seaverage

      新生代收集器,多執行緒,複製演算法,更加關注吞吐量。

      特點:

  • 多執行緒

  • 複製演算法

  • 可控制的吞吐量

  • 自適應調節策略

吞吐量 = 使用者程式碼執行時間/(使用者程式碼執行時間+垃圾回收時間)

      eg: 虛擬機器執行使用者程式碼時間為99 ,垃圾回收為1 ,則吞吐量為99/(99+1)=99%

      自適應調節策略:UseAdaptiveSizePolicy引數,這個引數開啟後,不用手動設定Eden和s1、s2的大小比例,收集器會根據當前虛擬機器執行情況收集效能監控資訊,動態的調整這些引數以供最合適的停頓時間和最大的吞吐量。

      可以說,自適應調節策略是Parallel Scaverage和ParNew的主要區別。


Serial Old

      老年代回收器。是一個單執行緒,使用標記-整理演算法的垃圾收集器。

      特點:

  • 單執行緒

  • 標記-整理演算法

  • 暫停所有使用者執行緒

Parallel Old

      老年代收集器。是Parallel Scaverage的老年代版本。使用多執行緒和標記-整理演算法。

      特點:

  • 多執行緒

  • 標記-整理演算法

CMS

      老年代收集器。

      Concurrent Mark Sweep,是一種獲取最短停頓時間為目標的回收器。現在很多業務場合都要求挺短時間短,CMS非常適合這種業務場景。

      從Mark Sweep可以看出,這是一種標記清除演算法,步驟:

      1.初始標記

      2.併發標記

      3.重新標記

      4.併發清除

這裡寫圖片描述

      特點:

  • 多執行緒

  • 標記清除演算法

  • 對CPU資源敏感

  • 儘可能小的縮短停頓時間

  • 無法處理浮動垃圾

  • 產生記憶體碎片


G1

      G1垃圾收集器是面向服務端應用的垃圾收集器。在垃圾收集過程中,是可以替換掉CMS的

      特點:

  • 並行與併發:充分利用cpu,縮短STW停頓時間,不用停頓GC操作,併發執行。

  • 分代收集

  • 空間整合:整體上基於標記-整理演算法,區域性上是基於複製演算法實現,不會產生記憶體碎片。

  • 可預測的停頓

四、小結

      通過對這些垃圾收集器的理解,對比。相信可以更好的處理這些問題。也希望可以給您帶來幫助。開啟語音,多多交流。

相關文章