一、并行垃圾收集器
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秒