java啓動參數內能夠指定gc的方式,實際狀況中參數比較多,摘出部分參數看一下php
A: -XX:+UseG1GC -XX:MaxGCPauseMillis=200html
B: -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnlyjava
上述兩個狀況分別簡稱爲A,B。算法
對於B使用的gc方法是CMS,對於A使用的G1。佈局
須要注意一下,對於CMS的內存結構是這樣的spa
可是對於G1,內存劃分不是整塊整塊的,而是把整個內存一整塊堆切分紅2000個小region,而後年輕代和年老代混排,對於G1,倖存者區域只有一個,因此在執行"jstat -gc"的時候,會看到S0老是空的。【參考資料2,3】線程
jstat -gc <pid>輸出的信息單位是KB不是字節htm
gc條件比較多,說一下常見的條件對象
對於CMS,伊甸園區滿了就會GCblog
對於G1,伊甸園區滿了就會GC,另外還有一個參數控制,當整個堆內存達到必定比例就會GC,InitiatingHeapOccupancyPercent。
G1中提供了三種模式垃圾回收模式,young gc、mixed gc 和 full gc,在不一樣的條件下被觸發。
一、Young gc
eden region被耗盡沒法申請內存時,就會觸發一次young gc
二、Mixed gc
當愈來愈多的對象晉升到老年代old region時,爲了不堆內存被耗盡,虛擬機會觸發一個混合的垃圾收集器,即mixed gc
閾值參數 -XX:InitiatingHeapOccupancyPercent,整個堆大小百分比達到該閾值時,會觸發一次mixed gc
三、Full gc
老年代被填滿,就會觸發一次full gc,G1的full gc算法就是單線程執行的serial old gc,會致使異常長時間的暫停時間
參考資料:
https://www.cnblogs.com/hunrry/p/9210022.html
https://hllvm-group.iteye.com/group/topic/42352
http://blog.didispace.com/step-by-step-g1/
https://www.jianshu.com/p/0f1f5adffdc1
http://www.javashuo.com/article/p-asoscqjy-gt.html
【參考資料2】
由於G1的堆佈局跟HotSpot VM裏其它GC不同——它只有一組邏輯上的survivor space,而不像其它HotSpot GC同樣有兩段明確、固定的地址空間用做survivor space——因此用jstat看G1的話確定是survivor space 0顯示0%,survivor space 1顯示100%。這個是正常的。 您看G1在初始化jstat用的計數器的時候就指定了s0永遠是0: