1. 程式人生 > >JAVA垃圾回收Garbage Collection(二、垃圾收集器

JAVA垃圾回收Garbage Collection(二、垃圾收集器

其余 精確 建立 完成 java虛擬機 接受 歷史 區別 size

垃圾收集器

  • HotSpot虛擬機的垃圾收集器
    •   Java虛擬機規範中對垃圾收集器如何實現沒有任何規定,因此不同版本的虛擬機所提供的垃圾收集器都可能有很大的差別,並且都會提供參數供用戶自己應用的特點和要求組合出各個年代使用的收集器。java 1.7之後的Hotspot虛擬機包含的收集器如下:
    • 技術分享圖片

    • 新生代收集器:Serial ,ParNew,Parallel Scavenge
    • 老年代收集器:CMS,Serial Old,Parallel Old
    • 獨立堆收集器:G1
  • Serial收集器
    •   serial收集器是最基本發展歷史最悠久的收集器。在jdk1.3之前是虛擬機新生代收集的唯一選擇。這個收集器是單線程收集器,但它單線程的意義並不僅僅說明它只會使用一個CPU或者一條收集線程去完成垃圾收集工作,更重要的是,它進行垃圾收集時,必須暫停其他所有的線程,之道它收集結束。"Stop The World"是這個收集器的特點。這個工作其實是由虛擬機在後臺自動發起自動完成的在用戶不可見的情況下把用戶正常工作的線程全部停掉對很多應用難以接受。但是虛擬機開發團隊為消除或者工作線程因為內存回收而導致的停頓一直努力進行著,從serial到Parallel收集器到CMS再到G1,一個個越來越優秀的收集器出現,用戶線程停頓時間不斷縮短,但是仍然沒辦法消除。
    • serial優點:簡單高效,對單CPU的環境Serial收集器由於沒有線程交互的開銷,專心做垃圾收集自然可以獲得最高的單線程收集效率,在應用場景中分配給虛擬機內存的一般不會很大,收集幾十上百兆的新生代時,停頓時間可以控制到幾十毫秒最多一百毫秒內只要不是頻繁發生這點停頓是可以接受的。所以serial在Client模式下的虛擬機是個很好的選擇。
    • 技術分享圖片

  • ParNew收集器
    •   ParNew收集器其實是Serial收集器的多線程版本,除了使用多線程進行垃圾回收外,其余包括Serial收集器的所有可控參數,收集算法,Stop The World 對象分配規則,回收策略都和Serial一樣。示意圖如下:
    • 技術分享圖片

    • 目前只有ParNew收集器能和CMS收集器配合工作,成為Server模式下虛擬機的首選新生代收集器。
  • Parallel Scavenge收集器
    •   新生代收集器,使用的也是復制算法Parallel Scavenge收集器的特點是它的關註點和其他收集器不同CMS等收集器的關註點是盡可能的縮短垃圾收集時用戶線程的停頓時間,而Parallel Scavenge收集器的目標則是達到一個可控的吞吐量(ThroughPut)。吞吐量:就是cpu用於運行用戶代碼的時間與cpu總消耗時間的比值,吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間),虛擬機運行了100分鐘,垃圾收集花掉1分鐘,吞吐量就是99%。
      • Parallel Scavenge 收集器總共有兩個參數用以精確控制吞吐量分別是:最大垃圾收集停頓時間-XX:MaxGCPauseMills,直接設置吞吐量大小的-XX:GCTimeRatio
      • MaxGCPauseMills:GC停頓時間縮短是犧牲吞吐量和新生代空間換來的,系統把新生代調小點,收集200M肯定比500M快,這也導致垃圾收集器更加頻繁的原來10s一次,每次100ms,現在是5s一次每次70ms。停頓時間下來了,吞吐 量也下來了。
      • GCTimeRatio:0-100的整數,垃圾收集時間占總時間的占比,就是吞吐量的倒數;如默認是99 就是占用1%(1/(99+1))的垃圾收集時間;
      • -XX:+UseAdaptiveSizePolicy:打開後不需要手動設定Eden Survivor比例,老年代對象大小的細節參數,續集及會動態調整這些參數以提供最適合的停頓時間或者最大的吞吐量。自適應調節也是與ParNew收集器的重要區別。
  • Serial Old
    •   serial的老年代版本,單線程收集器使用標記-整理算法,主要在Client模式下的虛擬機下使用
    •   JDK1.5之前與Parallel Scavenge收集器搭配使用,CMS的後備預案
  • Parallel Old
    •   Parallel Scavenge收集器的老年代版本,使用多線程和標記整理算法。
    • 新生代如果選擇了Parallel Scavenge收集器,老年代只能使用Serial Old,有了Parallel Old出現後,在註重吞吐量和CPU敏感的資源場合可以優先使用Parallel Scavenge和Parallel Old組合。
    • 技術分享圖片

  • CMS(Concurrent Mark Sweep)
    •   技術分享圖片

  • G1(Garbage First)
    • G1收集器是一款面向服務端應用的垃圾收集器
      • 並行與並發:G1能充分利用多CPU多核環境下的硬件優勢,使用多個CPU來縮短Stop-The-World的時間
      • 分代收集:G1收集器可收集新生代老年代兩種,不需要其他收集器配合就可以獨立管理整個GC堆
      • 空間整合:G1采用"標記-整理"算法實現收集器,意味著G1運作期間不會產生內存空間碎片,收集後可提供規整的可用內存
      • 可預測的停頓:建立可預測的停頓時間模型,能讓使用者明確指定一個長度為M毫秒的時間片段內,消耗在垃圾收集器上的時間不得超過N毫秒技術分享圖片

JAVA垃圾回收Garbage Collection(二、垃圾收集器