JVM經常使用新生代垃圾收集器

[TOC]算法

Serial垃圾收集器

Serial是單線程垃圾回收器,當須要執行垃圾回收時,程序會暫停一切工做,而後單線程執行垃圾回收.多線程

image-20201103131429173

單線程的好處就是減小上下文切換,減小系統開銷.可是這種方式的缺點也很明顯,在GC的過程當中,會暫停程序執行. 若GC發生不頻繁能夠選這個. 對於新聲代來講,區域比較小,停頓時間短.

優勢

  • 簡單高效,是Client模式下默認的垃圾收集器;
  • 對於資源受限的環境,好比單核(例如Docker中設置單核),單線程效率較高;
  • 內存小於一兩百兆的桌面程序中,交互有限,則有限的STW是能夠接受的。

缺點:

  • 垃圾回收速度較慢且回收能力有限,頻繁的STW會致使較差的使用體驗。

應用場景

  • 是HotSpot在Client模式下默認的新生代垃圾收集器
  • 在用戶的桌面應用場景中,可用內存通常不大(幾十M至一兩百M),能夠在較短期內完成垃圾收集(幾十MS至一百多MS),只要不頻繁發生,這是能夠接受的

ParNew垃圾收集器

ParNew一樣用於新生代,是Serial的多線程版本,而且在參數,算法(一樣的複製算法)和Serial相同.

Par是Parallel的縮寫,多線程的意思,可是這裏的多線程僅僅指垃圾收集多線程並行,並非垃圾收集和程序並行運行.ParNew也須要暫停一切工做,而後多線程並行垃圾收集.性能

image-20201104161310688

由於是多線程執行,因此在多CPU環境下,效率比Serial高,可是在單CPU環境下,由於線程切換,反而性能比較差.spa

應用場景

在Server模式下,ParNew是一個很是重要的收集器,由於除Serial外,目前只有ParNew與CMS收集器配合工做.

image-20201104162415151

參數

  • "-XX:+UseConcMarkSweepGC":指定使用CMS後,會默認使用ParNew做爲新生代收集器;
  • "-XX:+UseParNewGC":強制指定使用ParNew;
  • "-XX:ParallelGCThreads":指定垃圾收集的線程數量,ParNew默認開啓的收集線程與CPU的數量相同;

Parallel scavenge垃圾收集器

Parallel scavenge是一個新生代垃圾收集器,它是用複製算法的垃圾收集器,又是多線程並行的垃圾收集器,和ParNew相似.吞吐量優先的垃圾收集器,是Java1.8默認的新生代垃圾收集器.

主要特色

Parallel scavenge收集器的目標是達到一個可控的吞吐量,(吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間))

使用場景

Parallel scavenge收集器的高吞吐量能夠最高效率的利用CPU,儘快的完成程序的運算任務,主要適合後臺運算而不是太多交互的任務(太多交互的任務,適合用響應時間優先的CMS垃圾收集器)

Parallel scavenge能夠精確控制吞吐量,經過兩個參數:控制最大垃圾收集停頓時間-XX:MaxGCPauseills,設置吞吐量大小-XX:GCTimeRatio(GCTimeRatio的默認值爲99,所以,GC耗時的佔比應爲1/(1+99)=1%。使用參數的理論效果:GCTimeRatio越大,吞吐量越大,GC的總耗時越小。有可能致使單次MinorGC耗時變長。適用於高運算場景). 它還能夠用-XX:+UseAdaptiveSizePolicy參數進行自適應調節(GC Ergonomics),打開後會JVM會根據當前的運行情況動態調整最適合的吞吐量,配合前面兩個參數更好.線程

相關文章
相關標籤/搜索