第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

發(fā)生YGC時(shí)的一些細(xì)節(jié)

標(biāo)簽:
Java

简书 占小狼
转载请注明原创出处,谢谢!

周末抽空把YGC的源码实现重新看了一遍,发现细节远比知道的多...

首先要知道,什么情况会导致YGC的发生?最常见的情况是在年轻代分配内存时,出现空间不足,这里的内存分配,有可能是TLAB,也有可能是一个对象(该对象在TLAB中放不下,但虚拟机不想重新申请TLAB,就在Eden区分配)

1、如果触发的YGC顺利执行完,期间没有发生任何问题,垃圾回收完成后,正常的分配内存。

2、如果YGC刚要开始执行,却不幸的发生了JNI的GC locker,本次的YGC会被放弃,如果是给对象分配内存,会在老年代中直接分配内存,如果是TLAB的话,就要等JNI结束了。

3、如果没有JNI的干扰,在YGC过程中,对象年纪达到阈值,正常晋升,或to空间不足,对象提前晋升,但老年代又没这么多空间容纳晋升上来的对象,这时会发生“promotion failed”,而且eden和from区的空间没办法清空, 把from区和to区进行swap,所以当前eden和from的使用率都是接近100%的,如果当前是给对象(非TLAB)申请内存,会继续触发一次老年代的回收动作,下面是一个例子:

/**
 * -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日志:

https://img1.sycdn.imooc.com//5d5e13e90001840e08800319.png

1、“promotion failed” 如期到来。
2、对老年代进行了一次回收,这次回收有两种方式,一种是compact,另一种是mark-sweep,显然第一种会进行内存的压缩操作,第二种只进行标记清除。到底会使用哪一种,会进行如下判断:

https://img1.sycdn.imooc.com//5d5e13eb0001d84708910193.png

其中UseCMSCompactAtFullCollection默认是开启的,而且CMSFullGCsBeforeCompaction默认是0,所以如果没有重新设置该参数的话,按理说,每次都是会进行compact操作,如果CMSFullGCsBeforeCompaction被设置成一个大于0的值,还有其它条件可以导致compact,一个是如System.gc,另一个是发生了promotion failed,还有其它等等。

本例子中虽然使用了-XX:+UseConcMarkSweepGC,但是不会使用并发的CMS算法,如果当前CMS的background collect已经开始执行,当前GC线程会抢过执行权,并记录“concurrent mode failed”。

如果需要compact,采用单线程的Serial GC进行回收,该算法实现在genMarkSweep.cpp

如果不需要compact,则执行一个标记-清除的过程,实现在CMSCollector::collect_in_foreground中。

3、同样对永久带也来了一次回收

从这个打印出来的日志可以发现,本次的YGC是分配对象时触发的,而不是TLAB(因为在JVM运行过程中,会动态调整TLAB的大小和最大浪费空间),虽然日志中没有FULL GC的字样,其实执行的就是一次full gc过程。

本来我一直纳闷为啥TLAB的分配,会导致老年代的回收,因为如果是TLAB的话,老年代的should_allocate方法实现如下:

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,所以不会继续对老年代进行回收。


渐行渐远,细节远不止这些,不要在细节中迷失了自己...


作者:占小狼
链接:https://www.jianshu.com/p/b9c587afed84

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消