補(bǔ)充:堆內(nèi)存是指JVM的內(nèi)存大小包括堆區(qū)和非堆區(qū);
-server 服務(wù)器模式運(yùn)行,-client表示客戶端運(yùn)行模式;
-Xms2G 最小JVM內(nèi)存2G,是JVM的堆區(qū)的大小,不包括PermGen;
-Xmx3G 最大JVM內(nèi)存3G,是JVM的堆區(qū)的大小,不包括PermGen;
-Xmn1G 指定JVM堆區(qū)中新生代的初始化大小為1G;
What(是什么)
Parallel Scavenge收集器是Java虛擬機(jī)中垃圾收集器的一種。
又稱為吞吐量優(yōu)先收集器,和ParNew收集器類似,是一個(gè)新生代收集器。使用復(fù)制算法的并行多線程收集器。Parallel Scavenge是Java1.8默認(rèn)的收集器,特點(diǎn)是并行的多線程回收,以吞吐量優(yōu)先。
Why(為什么)
1.主要特點(diǎn)
Parallel Scavenge收集器的關(guān)注點(diǎn)與其他收集器不同, Parallel Scavenge收集器的目標(biāo)則是達(dá)到一個(gè)可控制的吞吐量(Throughput)
(吞吐量=運(yùn)行用戶代碼時(shí)間/(運(yùn)行用戶代碼時(shí)間+垃圾收集時(shí)間))
2.使用場景
Parallel Scavenge收集器的高吞吐量可以最高效率的利用CPU時(shí)間,盡快的完成程序的運(yùn)算任務(wù)等,主要適合在后臺(tái)運(yùn)算而不是太多交互的任務(wù)(其不適合需要與用戶交互的程序,良好的響應(yīng)速度能提升用戶的體驗(yàn),此種場景CMS效果更好)。
How(怎么做)
1. 重要參數(shù)
重要的參數(shù)有三個(gè),其中兩個(gè)參數(shù)用于精確控制吞吐量,分別是
1.1. 控制最大垃圾收集停頓時(shí)間的-XX:MaxGCPauseMillis參數(shù)
MaxGCPauseMillis參數(shù)允許的值是一個(gè)大于0的毫秒數(shù),收集器將盡力保證內(nèi)存回收花費(fèi)的時(shí)間不超過設(shè)定值。不過大家不要異想天開地認(rèn)為如果把這個(gè)參數(shù)的值設(shè)置得稍小一點(diǎn)就能使得系統(tǒng)的垃圾收集速度變得更快,GC停頓時(shí)間縮短是以犧牲吞吐量和新生代空間來換取的:系統(tǒng)把新生代調(diào)小一些,收集300MB新生代肯定比收集500MB快吧,這也直接導(dǎo)致垃圾收集發(fā)生得更頻繁一些,原來10秒收集一次、每次停頓100毫秒,現(xiàn)在變成5秒收集一次、每次停頓70毫秒。停頓時(shí)間的確在下降,但吞吐量也降下來了。1.2. 直接設(shè)置吞吐量大小的 -XX:GCTimeRatio參數(shù)。
GCTimeRatio參數(shù)的值應(yīng)當(dāng)是一個(gè)大于0小于100的整數(shù),也就是垃圾收集時(shí)間占總時(shí)間的比率。如果把此參數(shù)設(shè)置為19,那允許的最大GC時(shí)間就占總時(shí)間的5%(即1 /(1+19)),默認(rèn)值為99,就是允許最大1%(即1 /(1+99))的垃圾收集時(shí)間。1.3. UseAdaptiveSizePolicy開關(guān)參數(shù)。
-XX:+UseAdaptiveSizePolicy是一個(gè)開關(guān)參數(shù),當(dāng)這個(gè)參數(shù)打開之后,就不需要手工指定新生代的大?。?Xmn)、Eden與Survivor區(qū)的比例(-XX:SurvivorRatio)、晉升老年代對(duì)象年齡(-XX:PretenureSizeThreshold)等細(xì)節(jié)參數(shù)了,虛擬機(jī)會(huì)根據(jù)當(dāng)前系統(tǒng)的運(yùn)行情況收集性能監(jiān)控信息,動(dòng)態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時(shí)間或最大的吞吐量,這種調(diào)節(jié)方式稱為GC自適應(yīng)的調(diào)節(jié)策略(GC Ergonomics)。1.4. GC Ergonomics:表示GC的自適應(yīng)調(diào)節(jié)策略,其中Ergonomics單詞表示工效學(xué),人體工程學(xué)的意思。
2. 自適應(yīng)調(diào)節(jié)策略
Parallel Scavenge收集器能夠配合自適應(yīng)調(diào)節(jié)策略,把內(nèi)存管理的調(diào)優(yōu)任務(wù)交給虛擬機(jī)去完成。只需要把基本的內(nèi)存數(shù)據(jù)設(shè)置好(如-Xmx設(shè)置最大堆),然后使用-XX:MaxGCPauseMillis參數(shù)(更關(guān)注最大停頓時(shí)間)或GCTimeRatio參數(shù)(更關(guān)注吞吐量)給虛擬機(jī)設(shè)立一個(gè)優(yōu)化目標(biāo),那具體細(xì)節(jié)參數(shù)的調(diào)節(jié)工作就由虛擬機(jī)完成了。
自適應(yīng)調(diào)節(jié)策略也是Parallel Scavenge收集器與ParNew收集器的一個(gè)重要區(qū)別。
-XX:-UseParallelGC 和 -XX:+UseParallelOldGC
Parallel New參考
使用方式:-XX:+UseParallelGC強(qiáng)制使用該收集器,打開該收集器后,將使用Parallel Scavenge(年輕代)+Serial Old(老年代)的組合進(jìn)行GC。
Parallel Old參考:是Parallel Scavenge收集器的老年代版本,用于老年代的垃圾回收,但與Parallel Scavenge不同的是,它使用的是“標(biāo)記-整理算法”。
適用于注重于吞吐量及CPU資源敏感的場合。
使用方式:-XX:+UseParallelOldGC,打開該收集器后,將使用Parallel Scavenge(年輕代)+Parallel Old(老年代)的組合進(jìn)行GC。
補(bǔ)充
[GC[PSYoungGen 表示用的是年輕代使用Parallel Scavenge收集器。
[GC[ParNew 表示使用的是年輕代使用ParNew收集器(Parallel New收集器)。
[GC[DefNew 表示用的是年輕代使用Serial收集器(Serial New收集器)。
[GC[PSOldGen 表示用的是老年代使用的Parallel Old收集器。
JVM的GC日志的主要參數(shù)包括如下幾個(gè):
-XX:+PrintGC 輸出GC日志
-XX:+PrintGCDetails 輸出GC的詳細(xì)日志
-XX:+PrintGCTimeStamps 輸出GC的時(shí)間戳(以基準(zhǔn)時(shí)間的形式)
-XX:+PrintGCDateStamps 輸出GC的時(shí)間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進(jìn)行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime // 輸出GC造成應(yīng)用暫停的時(shí)間
-Xloggc:../logs/gc.log 日志文件的輸出路徑