1. 程式人生 > >JAVA垃圾收集器之Parallel Scavenge收集器

JAVA垃圾收集器之Parallel Scavenge收集器

Parallel Scavenge收集器是JAVA虛擬機器中垃圾收集器的一種。和ParNew收集器類似,是一個新生代收集器。使用複製演算法的並行多執行緒收集器。

1、特點

Parallel Scavenge收集器的關注點與其他收集器不同, ParallelScavenge收集器的目標則是達到一個可控制的吞吐量(Throughput)。所謂吞吐量就是CPU用於執行使用者程式碼的時間與CPU總消耗時間的比值,即吞吐量 = 執行使用者程式碼時間 /(執行使用者程式碼時間 + 垃圾收集時間),虛擬機器總共運行了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%

由於與吞吐量關係密切,Parallel Scavenge

收集器也經常被稱為“吞吐量優先”收集器。

該垃圾收集器,是JAVA虛擬機器在Server模式下的預設值,使用Server模式後,java虛擬機器使用Parallel Scavenge收集器(新生代)+ Serial Old收集器(老年代)的收集器組合進行記憶體回收。

2、使用場景

主要適應主要適合在後臺運算而不需要太多互動的任務。

比如需要與使用者互動的程式,良好的響應速度能提升使用者的體驗;而高吞吐量則可以最高效率地利用CPU時間,儘快地完成程式的運算任務等。

3、重要引數

重要的引數有三個,其中兩個引數用於精確控制吞吐量,分別是控制最大垃圾收集停頓時間的-XX:MaxGCPauseMillis

引數及直接設定吞吐量大小的 -XX:GCTimeRatio引數。另外一個是UseAdaptiveSizePolicy開關引數。

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

GCTimeRatio

引數的值應當是一個大於0小於100的整數,也就是垃圾收集時間佔總時間的比率,相當於是吞吐量的倒數。如果把此引數設定為19,那允許的最大GC時間就佔總時間的5%(即1 /1+19)),預設值為99,就是允許最大1%(即1 /1+99))的垃圾收集時間。

-XX:+UseAdaptiveSizePolicy是一個開關引數,當這個引數開啟之後,就不需要手工指定新生代的大小(-Xmn)、EdenSurvivor區的比例(-XX:SurvivorRatio)、晉升老年代物件年齡(-XX:PretenureSizeThreshold)等細節引數了,虛擬機器會根據當前系統的執行情況收集效能監控資訊,動態調整這些引數以提供最合適的停頓時間或最大的吞吐量,這種調節方式稱為GC自適應的調節策略(GC Ergonomics)。

4、自適應調節策略

Parallel Scavenge收集器能夠配合自適應調節策略,把記憶體管理的調優任務交給虛擬機器去完成。只需要把基本的記憶體資料設定好(如-Xmx設定最大堆),然後使用MaxGCPauseMillis引數(更關注最大停頓時間)或GCTimeRatio引數(更關注吞吐量)給虛擬機器設立一個優化目標,那具體細節引數的調節工作就由虛擬機器完成了。自適應調節策略也是Parallel Scavenge收集器與ParNew收集器的一個重要區別。

5、具體使用示例

原始碼

package com.gc;

import java.util.ArrayList;

import java.util.List;

/**

 * 簡單的JAVA虛擬機器記憶體回收,Parallel Scavenge收集器的使用

 * 執行引數,見具體方法,注意:需要開啟server模式才能使用

 * @author 範芳銘

 */

public class EasyParallelScavenge {

       public byte[] placeHolder =new byte[64 * 1024]; //佔位符

       public static voidmain(String[] args) throws Exception{

              outOfMemoryByExpansionSize();

       }

       /**

        * JAVA虛擬機器的大小適當可擴充套件,其中Xms30mXmx400m

        * 引數:-server -Xms30m-Xmx100m -XX:+UseParallelGC -XX:+PrintGCDetails

        * @author 範芳銘

        */

       private static voidoutOfMemoryByExpansionSize() throws Exception{

              List<EasyParallelScavenge>list = new ArrayList<EasyParallelScavenge>();

              while(true){

                     EasyParallelScavengeserial = new EasyParallelScavenge();

                     list.add(serial);

                     Thread.sleep(10);//停頓10毫秒

              }

       }

}

引數說明:

-server  伺服器模式執行

-Xms30m  最小JAVA虛擬機器記憶體30M

-Xmx100m最大JAVA虛擬機器記憶體100M

-XX:+UseParallelGC   明確指定使用Parallel Scavenge收集器

-XX:+PrintGCDetails 列印回收情況

執行結果如下:

[GC [PSYoungGen: 7449K->3728K(7552K)] 66980K->66980K(75136K),0.0022792 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7443K->3728K(7552K)] 70695K->70715K(75136K), 0.0027722 secs] [Times:user=0.00 sys=0.03, real=0.00 secs]

[Full GC [PSYoungGen:3728K->3136K(7552K)] [PSOldGen: 66986K->67563K(76928K)]70715K->70700K(84480K) [PSPermGen: 2088K->2088K(16384K)], 0.0038774 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen: 3714K->3744K(7552K)]71278K->71308K(84480K), 0.0017028 secs] [Times: user=0.00 sys=0.00,real=0.00 secs]

[GC [PSYoungGen:7459K->3744K(7552K)] 75023K->75025K(84480K), 0.0027427 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen: 7459K->3744K(7552K)]78739K->78753K(84480K), 0.0048844 secs] [Times: user=0.03 sys=0.00,real=0.01 secs]

[Full GC [PSYoungGen:3744K->1728K(7552K)] [PSOldGen: 75009K->76922K(87488K)]78753K->78651K(95040K) [PSPermGen: 2088K->2088K(16384K)], 0.0107597 secs][Times: user=0.00 sys=0.00, real=0.01 secs]

[GC [PSYoungGen:3714K->3744K(7552K)] 80637K->80667K(95040K), 0.0015904 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7459K->3728K(7552K)] 84382K->84372K(95040K), 0.0028244 secs] [Times:user=0.03 sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7443K->3728K(7552K)] 88087K->88093K(95040K), 0.0023412 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3728K->640K(7552K)] [PSOldGen: 84364K->87438K(91072K)]88093K->88078K(98624K) [PSPermGen: 2088K->2088K(16384K)], 0.0048474 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3714K->128K(7552K)] [PSOldGen: 87438K->91023K(91072K)]91153K->91151K(98624K) [PSPermGen: 2088K->2088K(16384K)], 0.0047349 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3714K->3714K(7552K)] [PSOldGen: 91023K->91023K(91072K)]94738K->94738K(98624K) [PSPermGen: 2088K->2088K(16384K)], 0.0031963 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen: 3714K->3649K(7552K)][PSOldGen: 91023K->91070K(91072K)] 94738K->94720K(98624K) [PSPermGen:2088K->2087K(16384K)], 0.0209529 secs] [Times: user=0.03 sys=0.00, real=0.02secs]

[Full GC [PSYoungGen:3713K->3713K(7552K)] [PSOldGen: 91070K->91070K(91072K)] 94784K->94784K(98624K)[PSPermGen: 2087K->2087K(16384K)], 0.0035128 secs] [Times: user=0.02sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3713K->3713K(7552K)] [PSOldGen: 91070K->91070K(91072K)]94784K->94784K(98624K) [PSPermGen: 2087K->2087K(16384K)], 0.0027033 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

Exception in thread "main"java.lang.OutOfMemoryError: Java heap space

    atcom.gc.EasyParNew.<init>(EasyParNew.java:12)

    atcom.gc.EasyParNew.outOfMemoryByExpansionSize(EasyParNew.java:39)

    atcom.gc.EasyParNew.main(EasyParNew.java:14)

Heap

 PSYoungGen     total 7552K, used 3776K [0x0e4b0000, 0x0efc0000, 0x0efc0000)

 eden space 3776K, 100% used [0x0e4b0000,0x0e860000,0x0e860000)

 from space 3776K, 0% used [0x0ec10000,0x0ec10000,0x0efc0000)

 to   space 3776K, 0% used[0x0e860000,0x0e860000,0x0ec10000)

 PSOldGen       total 91072K, used 91070K [0x08bc0000, 0x0e4b0000, 0x0e4b0000)

  object space 91072K, 99% used[0x08bc0000,0x0e4af980,0x0e4b0000)

6、和serialparNew兩種新生代收集器的簡單區別

[GC [DefNew: 1986K->128K(2112K),0.0011191 secs] 27809K->27808K(30528K), 0.0011425 secs] [Times: user=0.00sys=0.01, real=0.00 secs]

[GC [ParNew: 1990K->132K(2112K),0.0007742 secs] 24112K->24110K(30528K), 0.0007964 secs] [Times: user=0.00sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7449K->3728K(7552K)] 66980K->66980K(75136K), 0.0022792 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

GC[ParNew 表示使用的是parNew收集器。

GC[DefNew 表示用的是serial收集器。

[GC[PSYoungGen 表示用的是Parallel Scavenge收集器。

相關推薦

JAVA垃圾收集Parallel Scavenge收集

Parallel Scavenge收集器是JAVA虛擬機器中垃圾收集器的一種。和ParNew收集器類似,是一個新生代收集器。使用複製演算法的並行多執行緒收集器。 1、特點 Parallel Scavenge收集器的關注點與其他收集器不同, ParallelScavenge

JVM垃圾收集-Parallel Scavenge收集

tail 開關 復制 tails 分別是 虛擬 回收 article 原創 今天我給大家講講JVM垃圾收集器-Parallel Scavenge收集器 Parallel Scavenge收集器 ? ? ? ?Parallel Scavenge收集器也是一個新生代收集器,它也

Parallel Scavenge收集-GC日誌分析

1) jvm引數配置                  預設使用的就是Parallel Scavenge收集器             &nb

JVM垃圾收集-Serial Old收集Parallel Old收集

ref 作者 ESS 優先 jvm垃圾收集 log image csdn 組合 Serial Old收集器 ? ? ? Serial Old收集器是Serial收集器的老年代版本,它是一個單線程收集器,使用“標記-整理”算法。這個收集器的主要意義也是被Client模式下的虛

分類正負樣本收集、訓練、測試

分類器學習所需檔案如下: opencv工具 opencv_createsample.exe opencv_traincascade.exe 資料準備 1、pos資料夾 (正樣本) 2、neg資料夾 (負樣本

java垃圾回收演算法-引用計數器

引用計數器演算法算是一種古老的java垃圾回收演算法,目前很多版本的java已經廢棄掉這種演算法了。不過多瞭解歷史解決方案也是很有好處的,通過總結它的優缺點,再與新演算法比較,可以幫助更好的理解新演算法。 引用計數器演算法描述 定義:給每個物件分配一個計

java垃圾回收演算法-標記清除

java垃圾回收演算法之-引用計數器,這個演算法其中一個優點便是,實時性,只要物件的引用計數器的值為0,則立刻回收。接下來介紹的標記清除演算法,當物件的引用計數器的值為0時,不會立刻被回收的。 概念介紹 root物件 在標記清除演算法中,會把如

jQuery選擇屬性篩選選擇

jquery doctype 所有 asc 元素 input image sele lec 在這麽多屬性選擇器中[attr="value"]和[attr*="value"]是最實用的 [attr="value"]能幫我們定位不同類型的元素,特別是表單form元素的操作,比

文件服務三 FTP服務(鳥哥服務篇)

vsftpd ftp chroot 匿名學習鏈接:vsftpd官網:http://vsftpd.beasts.org/Filezilla 官方網站:http://filezilla.sourceforge.net/https://filezilla-project.org/51cto專題http://os.5

CSS選擇偽類選擇(偽元素)

寫法 cor outline p標簽 而不是 edit 實現 after tab selection [CSS4]應用於文檔中被用戶高亮的部分(比如使用鼠標或其他選擇設備選中的部分)。(IE8及以下不支持)(火狐-moz-selection)

Python:裝飾有參裝飾

In 類型 檢查 import must AI partial wrap pass from inspect import signature def f(a,b,c=1):pass sig = signature(f) sig.parameters 實現一個對被裝飾的

文件服務:SAMBA 服務,穩定可靠,沒有連接數限制

目錄 AI drive 用戶密碼 HA CP dump 代碼 samba配置 SAMBA使用的是NetBIOS通訊協議,NetBIOS是無法跨路由的透過NetBIOS over TCP/IP的技術,可以跨路由使用SAMBA服務器所提供的功能 SAMBA聯機模式:1、peer

jQuery中選擇子元素篩選

關於jQuery中選擇器之子元素篩選器相關用法,做以下程式碼驗證: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti

CSS:CSS選擇【組合選擇

前言 組合使用不同的選擇器可以匹配更特定的元素。有的複合選擇器能將目標樣式應用到更多元素,有的複合選擇器則會鎖定更少元素,總之會讓你的選擇非常具體。複合選擇器主要包括:群組選擇器、後代選擇器、子選擇器和同級元素選擇器。 群組選擇器 群組選擇器的使用範疇

CSS:CSS選擇【基本選擇

概述 CSS選擇器的作用是找出某類元素,以便我們使用style元素或者外部樣式表對這類元素設定樣式。CSS的基礎選擇器主要有三個:標籤選擇器、類選擇器、id選擇器和屬性選擇器。 通用選擇器 通用選擇器匹配文件中的所有元素。它是最基本的選擇器,不過很少使

選擇相鄰兄弟選擇、後代選擇、子代選擇

相鄰兄弟選擇器 相鄰兄弟選擇器困擾我很久了,從字面上理解感覺還是很好理解,但是就是不會使用,也是查了很多資料,最後才真正的解決了,也能夠比較正常的使用。下面是我整理的一些相關筆記。 選擇相鄰兄弟 如果需要選擇緊接在另一個元素後的元素,而且二者有相同的父元素

CSS/JQuery元素選擇&&和||,選擇的邏輯操作

使用CSS或JQuery選中元素的時候,很多時候我們需要對條件進行&&或者||操作。 JQuery或者CSS中的||操作是很常用的,也很簡單,就是通過逗號來分隔的。 selecto

組合選擇多元素選擇

多個標籤或選擇器同時宣告 如:h1,h2,ul,li{margin:0;padding:0;} 定義的方法注意思:選擇器之間用逗號隔開。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h

足球系統平臺出租.CSS:CSS選擇【組合選擇

前言組合使用不同的選擇器可以匹配更特定的元素。有的複合選擇器能將目標樣式應用到更多元素,有的複合選擇器則會鎖定更少元素,總之會讓你的選擇非常具體。複合選擇器主要包括:群組選擇器、後代選擇器、子選擇器和同級元素選擇器。一、群組選擇器群組選擇器的使用範疇是,多個選擇器使用同一個樣

jquery選擇偽類選擇

偽類選擇器: :nth-child的用法: nth-child是一個css3偽類選擇符,在jQuery中被實現了,在Jquery API中對nth-child的定義是:”匹配其父元素下的第N個子或奇偶元素“。 例  偽類nth-child實現隔行換色 <html xm