HotSpot VM GC 的種類

collector種類      

GC在 HotSpot VM 5.0裏有四種:

incremental (sometimes called train) low pause collector已被廢棄,不在介紹.

類別 serial collector parallel collector
( throughput collector )
concurrent collector
(concurrent low pause collector)
介紹

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

並行收集器
使用多線程的方式,利用多CUP來提高GC的效率
主要以到達一定的吞吐量爲目標

併發收集器
使用多線程的方式,利用多CUP來提高GC的效率
併發完成大部分工作,使得gc pause短

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

適用於科學技術和後臺處理
有中規模/大規模數據集大小的應用且運行在多處理器上,關注吞吐量(throughput)

適合中規模/大規模數據集大小的應用,應用服務器,電信領域
關注response time,而不是throughput

使用 Client模式下默認
可使用
可用-XX:+UseSerialGC強制使用
優點:對server應用沒什麼優點
缺點:慢,不能充分發揮硬件資源

Server模式下默認

--YGC:PS FGC:Parallel MSC

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

--ParallelGC代表FGC爲Parallel MSC

--ParallelOldGC代表FGC爲Parallel Compacting

優點:高效

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

可用-XX:+UseConcMarkSweepGC強制指定
優點:
對old進行回收時,對應用造成的暫停時間非常端,適合對latency要求比較高的應用
缺點:
1.內存碎片和浮動垃圾
2.old去的內存分配效率低
3.回收的整個耗時比較長
4.和應用爭搶CPU
內存回收觸發 YGC
eden空間不足
FGC
old空間不足
perm空間不足
顯示調用System.gc() ,包括RMI等的定時觸發
YGC時的悲觀策略
dump live的內存信息時(jmap –dump:live)
      
YGC
eden空間不足
FGC
old空間不足
perm空間不足
顯示調用System.gc() ,包括RMI等的定時觸發
YGC時的悲觀策略--YGC前&YGC後
dump live的內存信息時(jmap –dump:live)
      
YGC
eden空間不足
CMS GC
1.old Gen的使用率大的一定的比率 默認爲92%
2.配置了CMSClassUnloadingEnabled,且Perm Gen的使用達到一定的比率 默認爲92%
3.Hotspot自己根據估計決定是否要觸法
4.在配置了ExplictGCInvokesConcurrent的情況下顯示調用了System.gc.
Full GC(Serial MSC)
promotion failed 或 concurrent Mode Failure時;
內存回收觸發時發生了什麼 YGC
清空eden+from中所有no ref的對象佔用的內存
將eden+from中的所有存活的對象copy到to中
在這個過程中一些對象將晉升到old中:
--to放不下的
--存活次數超過tenuring threshold的
重新計算Tenuring Threshold;
單線程做以上動作
全程暫停應用
FGC
如果配置了CollectGen0First,則先觸發YGC
清空heap中no ref的對象,permgen中已經被卸載的classloader中加載的class的信息
單線程做以上動作
全程暫停應用
YGC
同serial動作基本相同,不同點:
1.多線程處理
2.YGC的最後不僅重新計算Tenuring Threshold,還會重新調整Eden和From的大小
FGC
1.如配置了ScavengeBeforeFullGC(默認),則先觸發YGC(??)
2.MSC:清空heap中的no ref對象,permgen中已經被卸載的classloader中加載的class信息,並進行壓縮
3.Compacting:清空heap中部分no ref的對象,permgen中已經被卸載的classloader中加載的class信息,並進行部分壓縮
多線程做以上動作.

YGC
同serial動作基本相同,不同點:
1.多線程處理
CMSGC:
1.old gen到達比率時只清除old gen中no ref的對象所佔用的空間
2.perm gen到達比率時只清除已被清除的classloader加載的class信息
FGC
同serial
細節參數 可用-XX:+UseSerialGC強制使用
-XX:SurvivorRatio=x,控制eden/s0/s1的大小
-XX:MaxTenuringThreshold,用於控制對象在新生代存活的最大次數
-XX:PretenureSizeThreshold=x,控制超過多大的字節的對象就在old分配.
-XX:SurvivorRatio=x,控制eden/s0/s1的大小
-XX:MaxTenuringThreshold,用於控制對象在新生代存活的最大次數

-XX:UseAdaptiveSizePolicy 去掉YGC後動態調整eden from已經tenuringthreshold的動作

-XX:ParallelGCThreads 設置並行的線程數

-XX:CMSInitiatingOccupancyFraction 設置old gen使用到達多少比率時觸發
-XX:CMSInitiatingPermOccupancyFraction,設置Perm Gen使用到達多少比率時觸發
-XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行觸發CMS GC

注:

  • throughput collector與concurrent low pause collector的區別是throughput collector只在young area使用使用多線程,而concurrent low pause collector則在tenured generation也使用多線程。
  • 根據官方文檔,他們倆個需要在多CPU的情況下,才能發揮作用。在一個CPU的情況下,會不如默認的serial collector,因爲線程管理需要耗費CPU資源。而在兩個CPU的情況下,也提高不大。只是在更多CPU的情況下,纔會有所提高。當然 concurrent low pause collector有一種模式可以在CPU較少的機器上,提供儘可能少的停頓的模式,見CMS GC Incremental mode
  • 當要使用throughput collector時,在java opt里加上-XX:+UseParallelGC,啓動throughput collector收集。也可加上-XX:ParallelGCThreads=<desired number>來改變線程數。還有兩個參數 -XX:MaxGCPauseMillis=<nnn>和 -XX:GCTimeRatio=<nnn>,MaxGCPauseMillis=<nnn>用來控制最大暫停時間,而-XX: GCTimeRatio可以提高GC說佔CPU的比,以最大話的減小heap。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章