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秒

 

 

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