發(fā)生YGC時的一些細節(jié)

簡書 占小狼
轉(zhuǎn)載請注明原創(chuàng)出處帘饶,謝謝亿卤!

周末抽空把YGC的源碼實現(xiàn)重新看了一遍叨襟,發(fā)現(xiàn)細節(jié)遠比知道的多...

首先要知道络它,什么情況會導致YGC的發(fā)生禾进?最常見的情況是在年輕代分配內(nèi)存時锈嫩,出現(xiàn)空間不足待逞,這里的內(nèi)存分配甥角,有可能是TLAB,也有可能是一個對象(該對象在TLAB中放不下识樱,但虛擬機不想重新申請TLAB嗤无,就在Eden區(qū)分配)

1、如果觸發(fā)的YGC順利執(zhí)行完怜庸,期間沒有發(fā)生任何問題当犯,垃圾回收完成后,正常的分配內(nèi)存割疾。

2嚎卫、如果YGC剛要開始執(zhí)行,卻不幸的發(fā)生了JNI的GC locker宏榕,本次的YGC會被放棄拓诸,如果是給對象分配內(nèi)存,會在老年代中直接分配內(nèi)存麻昼,如果是TLAB的話奠支,就要等JNI結(jié)束了。

3抚芦、如果沒有JNI的干擾倍谜,在YGC過程中迈螟,對象年紀達到閾值,正常晉升尔崔,或to空間不足答毫,對象提前晉升,但老年代又沒這么多空間容納晉升上來的對象季春,這時會發(fā)生“promotion failed”洗搂,而且eden和from區(qū)的空間沒辦法清空, 把from區(qū)和to區(qū)進行swap鹤盒,所以當前eden和from的使用率都是接近100%的蚕脏,如果當前是給對象(非TLAB)申請內(nèi)存,會繼續(xù)觸發(fā)一次老年代的回收動作侦锯,下面是一個例子:

/**
 * -Xmx20m -Xms20m -Xmn14m -XX:+UseParNewGC  -XX:+UseConcMarkSweepGC
 *-XX:+UseCMSInitiatingOccupancyOnly  -XX:CMSInitiatingOccupancyFraction=75
 *-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC
 */
public class JVM {

    private static final int _1MB = 1024 * 1024;
    private static final int _1K = 1024;

    public static void main(String[] args) throws Exception {
        byte[][] arr = new byte[10000][];
        for (int i = 0; i< 1200; i++) {
            arr[i] = new byte[10* _1K];
        }
        System.in.read();
    }
}

把年輕代設置的大點驼鞭,制造“promotion failed”,下面是gc日志:

1尺碰、“promotion failed” 如期到來挣棕。
2、對老年代進行了一次回收亲桥,這次回收有兩種方式洛心,一種是compact,另一種是mark-sweep题篷,顯然第一種會進行內(nèi)存的壓縮操作词身,第二種只進行標記清除。到底會使用哪一種番枚,會進行如下判斷:

其中UseCMSCompactAtFullCollection默認是開啟的法严,而且CMSFullGCsBeforeCompaction默認是0,所以如果沒有重新設置該參數(shù)的話葫笼,按理說深啤,每次都是會進行compact操作,如果CMSFullGCsBeforeCompaction被設置成一個大于0的值路星,還有其它條件可以導致compact溯街,一個是如System.gc,另一個是發(fā)生了promotion failed洋丐,還有其它等等呈昔。

本例子中雖然使用了-XX:+UseConcMarkSweepGC,但是不會使用并發(fā)的CMS算法友绝,如果當前CMS的background collect已經(jīng)開始執(zhí)行堤尾,當前GC線程會搶過執(zhí)行權(quán),并記錄“concurrent mode failed”九榔。

如果需要compact,采用單線程的Serial GC進行回收,該算法實現(xiàn)在genMarkSweep.cpp哲泊。

如果不需要compact剩蟀,則執(zhí)行一個標記-清除的過程,實現(xiàn)在CMSCollector::collect_in_foreground中切威。

3育特、同樣對永久帶也來了一次回收

從這個打印出來的日志可以發(fā)現(xiàn),本次的YGC是分配對象時觸發(fā)的先朦,而不是TLAB(因為在JVM運行過程中缰冤,會動態(tài)調(diào)整TLAB的大小和最大浪費空間),雖然日志中沒有FULL GC的字樣喳魏,其實執(zhí)行的就是一次full gc過程棉浸。

本來我一直納悶為啥TLAB的分配,會導致老年代的回收刺彩,因為如果是TLAB的話迷郑,老年代的should_allocate方法實現(xiàn)如下:

virtual bool should_allocate(size_t word_size, bool is_tlab) {
    bool result = false;
    size_t overflow_limit = (size_t)1 << (BitsPerSize_t - LogHeapWordSize);
    if (!is_tlab || supports_tlab_allocation()) {
      result = (word_size > 0) && (word_size < overflow_limit);
    }
    return result;
  }

其中is_tlab為true,supports_tlab_allocation()為false创倔,所以不會繼續(xù)對老年代進行回收嗡害。


漸行漸遠,細節(jié)遠不止這些畦攘,不要在細節(jié)中迷失了自己...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霸妹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子知押,更是在濱河造成了極大的恐慌叹螟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朗徊,死亡現(xiàn)場離奇詭異首妖,居然都是意外死亡,警方通過查閱死者的電腦和手機爷恳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門有缆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人温亲,你說我怎么就攤上這事棚壁。” “怎么了栈虚?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵袖外,是天一觀的道長。 經(jīng)常有香客問我魂务,道長曼验,這世上最難降的妖魔是什么泌射? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鬓照,結(jié)果婚禮上熔酷,老公的妹妹穿的比我還像新娘。我一直安慰自己豺裆,他們只是感情好拒秘,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臭猜,像睡著了一般躺酒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔑歌,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天羹应,我揣著相機與錄音,去河邊找鬼丐膝。 笑死量愧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的帅矗。 我是一名探鬼主播偎肃,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浑此!你這毒婦竟也來了累颂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤凛俱,失蹤者是張志新(化名)和其女友劉穎紊馏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒲犬,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡朱监,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了原叮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赫编。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奋隶,靈堂內(nèi)的尸體忽然破棺而出擂送,到底是詐尸還是另有隱情,我是刑警寧澤唯欣,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布嘹吨,位于F島的核電站,受9級特大地震影響境氢,放射性物質(zhì)發(fā)生泄漏蟀拷。R本人自食惡果不足惜碰纬,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望问芬。 院中可真熱鬧嘀趟,春花似錦、人聲如沸愈诚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炕柔。三九已至,卻和暖如春媒佣,著一層夾襖步出監(jiān)牢的瞬間匕累,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工默伍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欢嘿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓也糊,卻偏偏與公主長得像炼蹦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狸剃,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • System.gc整理 System.gc()源碼public static void gc() { Runtim...
    andersonoy閱讀 2,933評論 0 1
  • 在高并發(fā)下,Java程序的GC問題屬于很典型的一類問題僧凰,帶來的影響往往會被進一步放大探颈。不管是「GC頻率過快」還是「...
    AI喬治閱讀 1,193評論 0 12
  • JVM架構(gòu) 當一個程序啟動之前,它的class會被類裝載器裝入方法區(qū)(Permanent區(qū))训措,執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,650評論 0 7
  • 一. 前提 最近由于系統(tǒng)業(yè)務量比較大伪节,從生產(chǎn)的GC日志(結(jié)合Pinpoint)來看,需要對部分系統(tǒng)進行GC調(diào)優(yōu)隙弛。但...
    Java_蘇先生閱讀 267評論 0 2
  • 表情是什么架馋,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息全闷。高興了當然就笑了叉寂,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,450評論 2 7