Java虛擬機——Parallel Scavenge收集器

1:是什麼

  • Parallel Scavenge 收集器是⼀個新⽣代收集器,它也是使⽤複製算法的收集器,⼜是並⾏的 多線程收集器,由於與吞吐量關係密切,Parallel Scavenge 收集器也經常稱爲吞吐量優先收集器
  • 吞吐量是什麼?CPU⽤於運⾏⽤戶代碼的時間與CPU總時間的⽐值,99%時間執⾏⽤戶線 程,1%時間回收垃圾 ,這時候吞吐量就是99%

2:特點 

  • Parallel Scavenge 收集器的特點是它的關注點與其他收集器不同,CMS 等收集器的關注點是 儘可能地縮短垃圾收集時⽤戶線程的停頓時間,⽽ Parallel Scavenge 收集器的⽬標則是達到 個可控制的吞吐(Throughput)。所謂吞吐量就是 CPU ⽤於運⾏⽤戶代碼的時間與 CPU 總消耗時間的⽐值,即吞吐量=運⾏⽤戶代碼時間/(運⾏⽤戶代碼時間+垃圾收集時間),虛擬機總共運⾏了 100 分鐘,其中垃圾收集花掉 1 分鐘,那吞吐量就是 99% 停頓時間越短就越 適合需要與⽤戶交互的程序,良好的響應速度能提升⽤戶體驗,⽽⾼吞吐量則可以⾼效率地 利⽤ CPU 時間,儘快完成程序的運算任務,主要適合在後臺運算⽽不需要太多交互的任務。
  • 虛擬機會根據當前系統的運⾏情況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或者最⼤的吞吐量,這種調節⽅式稱爲 GC⾃適應調節策略

3:使用場景 

       Parallel Scavenge收集器的高吞吐量可以最高效率的利用CPU時間,儘快的完成程序的運算任務等,主要適合在後臺運算而不是太多交互的任務(其不適合需要與用戶交互的程序,良好的響應速度能提升用戶的體驗,此種場景CMS效果更好)。

 

 重要參數

重要的參數有三個,其中兩個參數用於精確控制吞吐量,分別是

  • 1.1. 控制最大垃圾收集停頓時間的-XX:MaxGCPauseMillis參數
    MaxGCPauseMillis參數允許的值是一個大於0的毫秒數,收集器將盡力保證內存回收花費的時間不超過設定值。不過大家不要異想天開地認爲如果把這個參數的值設置得稍小一點就能使得系統的垃圾收集速度變得更快,GC停頓時間縮短是以犧牲吞吐量和新生代空間來換取的:系統把新生代調小一些,收集300MB新生代肯定比收集500MB快吧,這也直接導致垃圾收集發生得更頻繁一些,原來10秒收集一次、每次停頓100毫秒,現在變成5秒收集一次、每次停頓70毫秒。停頓時間的確在下降,但吞吐量也降下來了。停頓時間與空間成反比。

  • 1.2. 直接設置吞吐量大小的 -XX:GCTimeRatio參數。
    GCTimeRatio參數的值應當是一個大於0小於100的整數,也就是垃圾收集時間佔總時間的比率。如果把此參數設置爲19,那允許的最大GC時間就佔總時間的5%(即1 /(1+19)),默認值爲99,就是允許最大1%(即1 /(1+99))的垃圾收集時間。

  • 1.3. UseAdaptiveSizePolicy開關參數。
    -XX:+UseAdaptiveSizePolicy是一個開關參數,當這個參數打開之後,就不需要手工指定新生代的大小(-Xmn)、Eden與Survivor區的比例(-XX:SurvivorRatio)、晉升老年代對象年齡(-XX:PretenureSizeThreshold)等細節參數了,虛擬機會根據當前系統的運行情況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或最大的吞吐量,這種調節方式稱爲GC自適應的調節策略(GC Ergonomics)。

  • 1.4. GC Ergonomics:表示GC的自適應調節策略,其中Ergonomics單詞表示工效學,人體工程學的意思。

Serial old收集器,它是⼀個單線程收集器,使⽤"標記--整理"算法

Parallel old收集器Parallel Scavenge收集器的⽼年代版本,使⽤多線程+標記整理算法

[GC[PSYoungGen 表示用的是年輕代使用Parallel Scavenge收集器。
[GC[ParNew 表示使用的是年輕代使用ParNew收集器(Parallel New收集器)。
[GC[DefNew 表示用的是年輕代使用Serial收集器(Serial New收集器)。
[GC[PSOldGen 表示用的是老年代使用的Parallel Old收集器。

JVM的GC日誌的主要參數包括如下幾個:

-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前後打印出堆的信息
-XX:+PrintGCApplicationStoppedTime // 輸出GC造成應用暫停的時間
-Xloggc:../logs/gc.log 日誌文件的輸出路徑

 

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