JDK8垃圾回收調優指南--(5)可用垃圾收集器

原文:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide--Available Collectors

截止目前討論的都是關於串行收集器的。Java HotSpot VM包含三種不同類型的收集器,每種收集器具有不同的性能特徵。

  • 串行收集器,使用一個線程執行所有垃圾收集工作,這使得它相對高效,因爲沒有線程之間的通信開銷。它最適合於單處理器機器,因爲它不能利用多處理器硬件,儘管它對運行在多處理器上的小數據集(約100 MB)的應用程序很有用(非最佳)。串行收集器在某些硬件和操作系統配置上是默認選擇的,或者可以通過選項'-XX:+UseSerialGC'顯式啓用。
  • 並行收集器(也稱爲吞吐量收集器),並行執行'minor collection',這可以顯著減少垃圾收集開銷。它適用於運行在多處理器或多線程硬件上,具有中型到大型數據集的應用程序。在某些硬件和操作系統配置上默認選擇並行收集器,或者可以使用命令行'-XX:+UseParallelGC'顯式啓用它。

“並行壓縮”是並行收集器並行地執行'major collection'時的特性。如果沒有並行壓縮,則使用單個線程執行'major collection',這將極大地限制可伸縮性。 如果指定了'-XX:+UseParallelGC'選項,則默認啓用並行壓縮。關閉它的選項是'-XX:-UseParallelOldGC'。

  • 大多數併發收集器,併發地執行大部分工作(例如,當應用程序仍在運行時),以保持GC停頓時間較短。它是爲具有中型到大型數據集的應用程序設計的,其響應時間比總體吞吐量更重要,因爲最小化暫停(回收頻率增加)會降低應用程序性能。JVM提供了2種併發收集器,參見併發收集器。使用選項'-XX:+UseConcMarkSweepGC'啓用CMS收集器,或者'-XX:+UseG1GC'啓用G1收集器。

Selecting a Collector

除非您的應用程序有相當嚴格的GC停頓要求,否則首先運行您的應用程序,並允許VM選擇收集器。如果需要,調整堆大小以提高性能。如果性能仍然沒有達到您的目標,那麼可以使用以下指南作爲選擇收集器的起點。

  • 如果應用程序有一個小的數據集(大約100 MB),那麼使用'-XX:+UseSerialGC'選項選擇串行收集器。
  • 如果應用程序將在單個處理器上運行,並且對GC停頓沒有要求,那麼讓VM(自動地)選擇收集器,或者使用'-XX:+UseSerialGC'選項選擇串行收集器。
  • 如果滿足2點:(a)應用程序性能的峯值是第一優先級,並且(b)對GC停頓無要求,暫停1秒或更長都是可以接受的,
    那麼讓VM選擇收集器,或者使用'-XX:+UseParallelGC'選擇並行收集器。
  • 如果響應時間比總體吞吐量更重要,並且GC停頓時間必須保持在大約1秒以內,那麼使用'-XX:+UseConcMarkSweepGC'或'-XX:+UseG1GC'選擇併發收集器。

這些指南只提供了選擇收集器的一個起點,因爲性能取決於①堆的大小、②應用程序維護的存活對象量以及③可用處理器的數量和速度。停頓時間對這些因素特別敏感,所以前面提到的1秒的閾值只是一個近似值:並行收集器在許多不同的數據集大小和硬件的組合上的GC停頓時間將超過1秒;相反,對於某些組合,併發收集器也不一定將GC停頓時間保持在1秒以內。

如果推薦的收集器沒有達到預期的性能,則首先嚐試調整堆和代的大小,以滿足預期的目標。如果性能仍然不夠好,那麼嘗試另一種收集器:使用併發收集器來減少GC停頓時間、使用並行收集器來增加多處理器硬件上的總體吞吐量。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章