JVM學習筆記——垃圾收集器

title: JVM學習筆記——垃圾收集器
date: 2018/9/4 17:09:31
description: 最近開始着手JVM的學習,在這裏把本身學習過程當中的筆記分享出來,但願能幫到一些小夥伴,同時也是對本身的學習的一個梳理。算法

垃圾收集器

垃圾收集器內容頗多,但算法原理都是基於垃圾收集算法,故這裏只簡單介紹一下各收集器的特色。多線程

  • HopSpot中的收集器羣


    兩個虛擬機之間的連線表示它們能夠搭配使用,反之則不能搭配。

  • Serial收集器

    Serial&Serial Old
    • 使用「標記-整理」算法
    • 「單線程」收集器,這裏的單線程指的是Serial在對某一條線程執行收集工做時,必須暫停其餘線程的運行,這就會形成大量的GC停頓出現。
    • 優勢是簡單高效,在Client模式的虛擬機中表現優秀。

  • Serial Old收集器

    • Serial的老年代版本,特性基本與Serial一致。
    • 在JDK1.5以前能夠與Parallel搭配使用,或者做爲CMS的後備方案。

  • ParNew收集器

    • ParNew就是針對Serial改進的多線程版本。
    • 在不少虛擬機中,ParNew倒是新生代的首選收集器,由於除了Serial只有它可以與CMS搭配使用。

  • Parallel Scavenge收集器

    Parallel Scavenge&Parallel Old
    • 是一個新生代的收集器,使用多線程+複製算法。
    • 主要關注吞吐量的收集器吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間),提供兩個參數用於精確控制吞吐量:
      • -XX:MaxGCPauseMillis,最大GC停頓時間。容許的值是一個大於0的毫秒數,收集器儘量保證收集時間不超過該值。注意,停頓時間縮短鬚要犧牲吞吐量和空間,更小的停頓時間可能會致使更頻繁的GC。
      • -XX:GCTimeRatio,GC時間佔總時間比率。是一個0-100之間的整數,等於吞吐量的倒數。

  • Parallel Old收集器

    • Parallel Scavenge的老年代版本,使用多線程+標記整理算法。
    • 因爲Serial Old在服務端上性能不佳,故有了該收集器與Parallel Scavenge進行搭配使用。

  • CMS收集器(Concurrent Mark Sweep)

    • 基於標記-清除算法實現,是一款以獲取最短GC停頓時間爲目標的收集器。它的運做過程分爲4步:
      • 初始標記
        標記GC Roots能關聯到的對象。
      • 併發標記
        由GC Roots發起對象的跟蹤,驗證是否可達。
      • 從新標記
        修正併發標記期間變更的一部分對象的標記記錄。
      • 併發清除
        清除標記對象的空間。
    其中只有初始標記與從新標記兩個過程須要進行停頓,可是這兩個過程僅僅是標記,速度很快,最漫長的清除過程在CMS下能夠與用戶線程並行處理。
    • CMS雖然很強大,但仍是有着如下3個缺點:
      • 雖然CMS不會致使GC停頓,但併發的代價就是會佔用CPU資源,可能會致使用戶程序變慢,在覈數較低的CPU中該問題會愈加明顯。
      • 因爲CMS的清理不會暫停用戶線程,可能致使「浮動垃圾」的出現,那就須要留出一部份內存空間對應「浮動垃圾」,因此CMS有一個觸發回收的內存比例,在JDK1.6中該值默認爲92%。若是預留的內存仍是沒法知足程序需求,CMS就會啓動備用方案(通常是Serial Old)來從新進行收集。
      • 因爲CMS使用的是標記-清除算法,因此會有大量的內存碎片產生,會致使大對象找不到空間存放而提早觸發一次Full GC進行內存整理。
  • G1收集器

    在JDK1.7以後纔出現的收集器,G1具有如下四個特色:
    • 並行與併發,能利用多線程,多CPU的優點,使得GC與用戶線程並行。
    • G1可以獨自對整個GC堆進行管理,而且留有了分代的特性,能夠根據不一樣的區域採用不一樣的方式處理。
    • 將Java堆劃分爲多個大小相等的獨立區域(Region),在Region上來看是基於複製算法實現的,從總體上看是基於標記-整理算法實現,結合了兩種算法的優勢。
    • 創建了可預測的停頓模型,能夠經過-XX:MaxGCPauseMillis來設置指望GC時間,G1會盡可能在該時間內完成GC。
相關文章
相關標籤/搜索