天天看點

jvm垃圾收集器(九)

一、并行垃圾收集器

1.Parallel Collector

-XX:+UseParallelGC 手動開啟并行垃圾收集,Server模式預設開啟

-XX:ParallelGCThreads=<N>  開啟多少個線程并行收集垃圾

CPU>8 ,則N=5/8;(CPU為8,開啟5個)

CPU<8,則N=CPU;

2.Parallel Collector Ergonomics

-XX:MaxGCPauseMillis=<N>響應時間

-XX:GCTimeRatio=<N> 吞吐量

-Xmx<N>最大最記憶體

可通過設定響應時間和吞吐量,讓jvm自适應來調整堆的大小。

二、并發CMS

1.并發收集,低停頓,低延遲,老年代收集器

2.過程

CMS initail mark :初始标記Root,STW。需要暫停應用程式

CMS concurrent mark:并發标記,根節點往後的标記,不需要暫停應用程式

CMS concurrent preclean :并發預清理

CMS remark:重新标記,STW。

CMS concurent sweep:并發清理

CMS concurrent reset:并發重置

3.CMS缺點

cpu敏感,因為在執行垃圾收集的過程中也會執行應用程式,

浮動垃圾,因為在垃圾回收的時候,應用程式也在運作,會進行空間配置設定的

空間碎片,因為采用的算法是标記清除算法,是以會産生空間碎片。

4.參數

-XX:ConcGCThreads :并發的GC線程數

-XX:+UseCMSCompactAtFullCollection :fullGC之後進行空間壓縮

-XX:CMSFullGCsBeforeCompaction:發生多少次fullGC之後做一次壓縮

-XX:CMSInitiatingOccupancyFraction:存活對象占old區空間率多少的時候進行一次fullGC

-XX:+UseCMSInitiatingOccupancyOnly:表示觸發FUllGC的條件是否是可動态調節的

-XX:+CMSScavengeBeforeRemark:在做fullGC之前是否執行一次mimorGC

-XX:+CMSClassUnloadingEnabled:是否啟用回收Perm區(在jdk7之前)

5.iCMS

适用于單核或者雙核(jdk8之後不再使用)

三、并發G1(jdk7開始使用,jdk8之後慢慢成熟)

1.新生代和老年代收集器,(jdk9預設的收集器)

2.實體上記憶體是不分區的,(old區和young區隻是邏輯上的分區)

3.Region(堆記憶體中的一個機關記憶體)

4.STAB:Snapshot-At-The-Beginning,它是通過Root Tracing得到的,GC開始時候存活對象的快照,後面的垃圾回收就是根據這個做判斷的。

5.Rset:記錄了其他Region中對象引用本對象的關系,屬于point-into結構(哪個對象引用了我)

6.YoungGC

 首先新對象進入Eden區,

 存活對象拷貝到Survivor區

 當對象存活時間到達年齡閥值當時,對象晉升到old區。

7.MixedGC

  G1中不存在fullGC。

   回收是以的young區和部分old區。

8.global concurrent mark

  Initial marking phase:标記GC root ,STW

  Root region scanning phase:标記存活的region

  Concurrent marking phase:标記存活的對象

  Remark phase:重新标記,STW

 Cleanup phase:部分标記,STW

9.參數

InitiatingHeapOccupancyParcent

堆占有率達到這個數值則觸發global concurrent marking,預設為45%

G1HeapWasteParcent

在全局标記結束之後,可以知道有多少記憶體會被回收,在每次YoungGC和再次發生MixedGC之前,會檢查垃圾占比是否達到此參數,隻有達到了,下次才會發生MixedGC。

G1MixedGCThresholdPercent

Old區的region被回收的時候存活對象的占比

G1MixedGCCountTarget

一次全局标記之後,最多執行MixedGC的次數

G1OldCSetRegionThresholdPercent

一次MixedGC在Old區最多能夠回收多少個region

-XX:+UseG1GC :是否開啟G1

-XX:G1HeapRegionSize=n,   region的大小,1~32M。最多為2048個region

-XX:ParallelGCThreads=n 并行垃圾收集的線程數,(需要停止應用程式)

-XX:ConcGCThreads=n 并發線程數=(1/4)*并行(比并發小,因為需要執行應用程式)

-XX:MaxGCPauseMillis=200 最大停頓時間

-XX:G1ReservePercent=10 保留記憶體,防治Young區中,Eden區S0區複制到S1區時記憶體不夠,溢出

10.實踐

年輕代大小:避免使用-Xmn、-XX:NewRatio等顯示設定Young區的大小,會覆寫暫時時間目标

暫停時間目标:暫停時間不要太苛刻,其吞吐量目标是90%的應用程式時間和10%的垃圾回收時間,太苛刻會影響吞吐量

11.是否需要切換到G1

50%以上的堆被存活對象占用

對象配置設定和晉升的速度變化非常大

垃圾回收時間長,超過1秒