Parallel Scavenge垃圾收集器因爲與吞吐量關係密切,也稱爲吞吐量收集器(Throughput Collector)。
1、特點
(A)、有一些特點與ParNew收集器相似
新生代收集器;
採用複製算法;
多線程收集;
(B)、主要特點是:它的關注點與其他收集器不同
CMS等收集器的關注點是儘可能地縮短垃圾收集時用戶線程的停頓時間;
而Parallel Scavenge收集器的目標則是達一個可控制的吞吐量(Throughput);
關於吞吐量與收集器關注點說明詳見本節後面;
2、應用場景
高吞吐量爲目標,即減少垃圾收集時間,讓用戶代碼獲得更長的運行時間;
當應用程序運行在具有多個CPU上,對暫停時間沒有特別高的要求時,即程序主要在後臺進行計算,而不需要與用戶進行太多交互;
例如,那些執行批量處理、訂單處理、工資支付、科學計算的應用程序;
3、設置參數
Parallel Scavenge收集器提供兩個參數用於精確控制吞吐量:
(A)、"-XX:MaxGCPauseMillis"
控制最大垃圾收集停頓時間,大於0的毫秒數;
MaxGCPauseMillis設置得稍小,停頓時間可能會縮短,但也可能會使得吞吐量下降;
因爲可能導致垃圾收集發生得更頻繁;
(B)、"-XX:GCTimeRatio"
設置垃圾收集時間佔總時間的比率,0<n<100的整數;
GCTimeRatio相當於設置吞吐量大小;
垃圾收集執行時間佔應用程序執行時間的比例的計算方法是:
1 / (1 + n)
例如,選項-XX:GCTimeRatio=19,設置了垃圾收集時間佔總時間的5%--1/(1+19);
默認值是1%--1/(1+99),即n=99;
垃圾收集所花費的時間是年輕一代和老年代收集的總時間;
如果沒有滿足吞吐量目標,則增加代的內存大小以儘量增加用戶程序運行的時間;
此外,還有一個值得關注的參數:
(C)、"-XX:+UseAdptiveSizePolicy"
開啓這個參數後,就不用手工指定一些細節參數,如:
新生代的大小(-Xmn)、Eden與Survivor區的比例(-XX:SurvivorRation)、晉升老年代的對象年齡(-XX:PretenureSizeThreshold)等;
JVM會根據當前系統運行情況收集性能監控信息,動態調整這些參數,以提供最合適的停頓時間或最大的吞吐量,這種調節方式稱爲GC自適應的調節策略(GC Ergonomiscs);
這是一種值得推薦的方式:
(1)、只需設置好內存數據大小(如"-Xmx"設置最大堆);
(2)、然後使用"-XX:MaxGCPauseMillis"或"-XX:GCTimeRatio"給JVM設置一個優化目標;
(3)、那些具體細節參數的調節就由JVM自適應完成;
這也是Parallel Scavenge收集器與ParNew收集器一個重要區別;
更多目標調優和GC自適應的調節策略說明請參考:
《Memory Management in the Java HotSpot™ Virtual Machine》 5節 Ergonomics -- Automatic Selections and Behavior Tuning:http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf
《Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide》 第2節 Ergonomics:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html#ergonomics
4、吞吐量與收集器關注點說明
(A)、吞吐量(Throughput)
CPU用於運行用戶代碼的時間與CPU總消耗時間的比值;
即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間);
高吞吐量即減少垃圾收集時間,讓用戶代碼獲得更長的運行時間;
(B)、垃圾收集器期望的目標(關注點)
(1)、停頓時間
停頓時間越短就適合需要與用戶交互的程序;
良好的響應速度能提升用戶體驗;
(2)、吞吐量
高吞吐量則可以高效率地利用CPU時間,儘快完成運算的任務;
主要適合在後臺計算而不需要太多交互的任務;
(3)、覆蓋區(Footprint)
在達到前面兩個目標的情況下,儘量減少堆的內存空間;
可以獲得更好的空間局部性;