日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入浅出JVM-GC过程

發(fā)布時(shí)間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出JVM-GC过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

深入淺出JVM-GC過程

  • Minor GC
  • 對象進(jìn)入老年代的4種情況
  • Full GC
  • 空間分配擔(dān)保

Minor GC

  • Minor GC過程
    假設(shè)現(xiàn)在Heap內(nèi)存大小為20M,其中年輕代為10M,老年代為10M,年輕代中Eden區(qū)6M,From區(qū)2M,To區(qū)2M,新創(chuàng)建的對象首先往Eden區(qū)分配,當(dāng)再次分配一個(gè)對象,假設(shè)大小為1M,此時(shí)Eden區(qū)已經(jīng)沒有足夠空間來給這個(gè)對象分配內(nèi)存,如圖所示:


這時(shí)候觸發(fā)一次Minor GC,把Eden區(qū)的存活對象轉(zhuǎn)移到From區(qū),非存活對象進(jìn)行清理,然后給新創(chuàng)建的對象分配空間,存入Eden區(qū)

隨著分配對象的增多,Eden區(qū)的空間又不足了:


這時(shí)候再觸發(fā)一次Minor GC,清理掉Eden區(qū)和S1區(qū)的死亡對象,把存活對象轉(zhuǎn)移到S2區(qū),然后再給新對象分配內(nèi)存:


From區(qū)和To區(qū)是相對的關(guān)系,哪個(gè)區(qū)中有對象,哪個(gè)區(qū)就是From區(qū),比如,再進(jìn)行一次Minor GC,會(huì)把存活對象轉(zhuǎn)移到S1區(qū),再為轉(zhuǎn)移之前,S2區(qū)是From區(qū),S1區(qū)是To區(qū),轉(zhuǎn)移后,S2區(qū)中沒有存活對象,變?yōu)門o區(qū),而S1區(qū)變?yōu)镕rom區(qū):

對象進(jìn)入老年代的4種情況

  • 假如進(jìn)行Minor GC時(shí)發(fā)現(xiàn),存活的對象在ToSpace區(qū)中存不下,那么把存活的對象存入老年代

  • 大對象直接進(jìn)入老年代
    假設(shè)新創(chuàng)建的對象很大,比如為5M(這個(gè)值可以通過PretenureSizeThreshold這個(gè)參數(shù)進(jìn)行設(shè)置,默認(rèn)3M),那么即使Eden區(qū)有足夠的空間來存放,也不會(huì)存放在Eden區(qū),而是直接存入老年代

  • 長期存活的對象將進(jìn)入老年代
    此外,如果對象在Eden出生并且經(jīng)過1次Minor GC后仍然存活,并且能被To區(qū)容納,那么將被移動(dòng)到To區(qū),并且把對象的年齡設(shè)置為1,對象沒"熬過"一次Minor GC(沒有被回收,也沒有因?yàn)門o區(qū)沒有空間而被移動(dòng)到老年代中),年齡就增加一歲,當(dāng)它的年齡增加到一定程度(默認(rèn)15歲,配置參數(shù)-XX:MaxTenuringThreshold),就會(huì)被晉升到老年代中

  • 動(dòng)態(tài)對象年齡判定
    還有一種情況,如果在From空間中,相同年齡所有對象的大小總和大于From和To空間總和的一半,那么年齡大于等于該年齡的對象就會(huì)被移動(dòng)到老年代,而不用等到15歲(默認(rèn)):

  • Full GC

    如果某個(gè)(些)對象(原來在內(nèi)存中存活的對象或者新創(chuàng)建的對象)由于以上原因需要被移動(dòng)到老年代中,而老年代中沒有足夠空間容納這個(gè)(些)對象,那么會(huì)觸發(fā)一次Full GC,Full GC會(huì)對整個(gè)Heap進(jìn)行一次GC,如果Full GC后還有無法給新創(chuàng)建的對象分配內(nèi)存,或者無法移動(dòng)那些需要進(jìn)入老年代中的對象,那么JVM拋出OutOfMemoryError

    空間分配擔(dān)保

    在發(fā)生Minor GC之前,虛擬機(jī)會(huì)先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間,如果這個(gè)條件成立,那么Minor GC可以確保是安全的。如果不成立,則虛擬機(jī)會(huì)查看HandlerPromotionFailure這個(gè)參數(shù)設(shè)置的值(true或flase)是否允許擔(dān)保失敗(如果這個(gè)值為true,代表著JVM說,我允許在這種條件下嘗試執(zhí)行Minor GC,出了事我負(fù)責(zé))。如果允許,那么會(huì)繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果大于,將嘗試進(jìn)行一次Minor GC,盡管這次Minor GC是有風(fēng)險(xiǎn)的;如果小于,或者HandlerPromotionFailure為false,那么這次Minor GC將升級為Full GC
    如果老年代最大可用的連續(xù)空間大于歷次晉升到老年代對象的平均大小,那么在HandlerPromotionFailure為true的情況下,可以嘗試進(jìn)行一次Minor GC,但這是有風(fēng)險(xiǎn)的,如果本次將要晉升到老年代的對象很多,那么Minor GC還是無法執(zhí)行,此時(shí)還得改為Full GC。
    HandlerPromotionFailure為true時(shí),如果某次需要轉(zhuǎn)移到老年代中的對象確實(shí)很多,老年代無法容納,那么也會(huì)先嘗試進(jìn)行一次Minor GC,Minor GC無法執(zhí)行時(shí)再進(jìn)行Full GC,這樣雖然繞了圈子,但我們還是建議把這個(gè)參數(shù)設(shè)置為true,因?yàn)槲覀円M量避免Full GC。

    總結(jié)

    以上是生活随笔為你收集整理的深入浅出JVM-GC过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。