天天看點

JVM系列四:HotSpot VM GC 的種類

HotSpotVMGC的種類

collector種類

GC在HotSpotVM5.0裡有四種:

incremental(sometimescalledtrain)lowpausecollector已被廢棄,不在介紹.

類别 serialcollector(串行)

parallelcollector(并行)

(throughputcollector)---(關注吞吐量)

concurrentcollector(并發)

(concurrentlowpausecollector)----(關注響應時間)

介紹

單線程收集器

使用單線程去完成所有的gc工作,沒有線程間的通信,這種方式會相對高效

并行收集器

使用多線程的方式,利用多CUP來提高GC的效率

主要以到達一定的吞吐量為目标

并發收集器

使用多線程的方式,利用多CUP來提高GC的效率

并發完成大部分工作,使得gcpause短

試用場景 單處理器機器且沒有pausetime的要求

适用于科學技術和背景處理

有中規模/大規模資料集大小的應用且運作在多處理器上,關注吞吐量(throughput)

适合中規模/大規模資料集大小的應用,應用伺服器,電信領域

關注responsetime,而不是throughput

使用

Client模式下預設

可使用

可用-XX:+UseSerialGC強制使用

優點:對server應用沒什麼優點

缺點:慢,不能充分發揮硬體資源

Server模式下預設

--YGC:PSFGC:ParallelMSC

可用-XX:+UseParallelGC或-XX:+UseParallelOldGC強制指定

--ParallelGC代表FGC為ParallelMSC

--ParallelOldGC代表FGC為ParallelCompacting

優點:高效

缺點:當heap變大後,造成的暫停時間會變得比較長

可用-XX:+

UseConcMarkSweepGC強制指定 優點: 對old進行回收時,對應用造成的暫停時間非常短,适合對響應時間要求比較高的應用 缺點: 1.記憶體碎片和浮動垃圾 2.old去的記憶體配置設定效率低 3.回收的整個耗時比較長 4.和應用争搶CPU

記憶體回收觸發

YGC

eden空間不足

FGC

old空間不足

perm空間不足

顯示調用System.gc(),包括RMI等的定時觸發

YGC時的悲觀政策

dumplive的記憶體資訊時(jmap–dump:live)

YGC時的悲觀政策--YGC前&YGC後

CMSGC

1.oldGen的使用率達到一定的比率預設為92%

2.配置了CMSClassUnloadingEnabled,且PermGen的使用達到一定的比率預設為92%

3.Hotspot自己根據估計決定是否要觸法

4.在配置了ExplictGCInvokesConcurrent的情況下顯示調用了System.gc.

FullGC(SerialMSC)

promotionfailed或concurrentModeFailure時;

記憶體回收觸發時發生了什麼

清空eden+from中所有noref的對象占用的記憶體

将eden+from中的所有存活的對象copy到to中

在這個過程中一些對象将晉升到old中:

--to放不下的

--存活次數超過tenuringthreshold的

重新計算TenuringThreshold;

單線程做以上動作

全程暫停應用

如果配置了CollectGen0First,則先觸發YGC

清空heap中noref的對象,permgen中已經被解除安裝的classloader中加載的class的資訊

同serial動作基本相同,不同點:

1.多線程處理

2.YGC的最後不僅重新計算TenuringThreshold,還會重新調整Eden和From的大小

1.如配置了ScavengeBeforeFullGC(預設),則先觸發YGC(??)

2.MSC:清空heap中的noref對象,permgen中已經被解除安裝的classloader中加載的class資訊,并進行壓縮

3.Compacting:清空heap中部分noref的對象,permgen中已經被解除安裝的classloader中加載的class資訊,并進行部分壓縮

多線程做以上動作.

CMSGC:

1.oldgen到達比率時隻清除oldgen中noref的對象所占用的空間

2.permgen到達比率時隻清除已被清除的classloader加載的class資訊

同serial

細節參數

-XX:SurvivorRatio=x,控制eden/s0/s1的大小

-XX:MaxTenuringThreshold,用于控制對象在新生代存活的最大次數

-XX:PretenureSizeThreshold=x,控制超過多大的位元組的對象就在old配置設定.

-XX:UseAdaptiveSizePolicy去掉YGC後動态調整edenfrom已經tenuringthreshold的動作

-XX:ParallelGCThreads設定并行的線程數

-XX:CMSInitiatingOccupancyFraction設定oldgen使用到達多少比率時觸發

-XX:CMSInitiatingPermOccupancyFraction,設定PermGen使用到達多少比率時觸發

-XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行觸發CMSGC

注:

  • throughputcollector與concurrentlowpausecollector的差別是throughputcollector隻在youngarea使用使用多線程,而concurrentlowpausecollector則在tenuredgeneration也使用多線程。
上一篇: ECS的初體驗
下一篇: ECS使用有感