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