最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析Java內(nèi)存分配和回收策略以及MinorGC、MajorGC、FullGC

 更新時(shí)間:2021年09月24日 09:24:26   作者:沒(méi)頭腦遇到不高興  
本節(jié)將會(huì)介紹一下:對(duì)象的內(nèi)存分配與回收策略;對(duì)象何時(shí)進(jìn)入新生代、老年代;MinorGC、MajorGC、FullGC的定義區(qū)別和觸發(fā)條件;還有通過(guò)圖示展示了GC的過(guò)程。

對(duì)象內(nèi)存分配與回收策略

對(duì)象的內(nèi)存分配,往大方向講,就是在堆上分配〔但也可能經(jīng)過(guò)JIT編譯后被拆散為標(biāo)量類(lèi)型并間接地棧上分配),對(duì)象主要分配在新生代的Eden區(qū)上,如果啟動(dòng)了本地線(xiàn)程分配緩沖,將按線(xiàn)程優(yōu)先在TLAB上分配。少數(shù)情況下也可能會(huì)直接分配在老年代中。

對(duì)象優(yōu)先分配在Eden區(qū),當(dāng)Eden區(qū)可用空間不夠時(shí)會(huì)進(jìn)行MinorGC

大對(duì)象直接進(jìn)入老年代:大對(duì)象即需要大量連續(xù)內(nèi)存空間的對(duì)象(例如很長(zhǎng)的字符串及數(shù)組)。虛擬機(jī)提供了一個(gè)-XX:PretenureSizeThreshoId參數(shù),令大于這個(gè)設(shè)置值的對(duì)象直接在老年代分配,這樣做的目的是避免在Eden區(qū)及兩個(gè)區(qū)之間發(fā)生大量的內(nèi)存復(fù)制。注意PretenureSizeThreshoId參數(shù)只對(duì)Serial和ParNew兩款收集器有效。

長(zhǎng)期存活的對(duì)象將進(jìn)入老年代:虛擬機(jī)給每個(gè)對(duì)象定義了一個(gè)對(duì)象年齡(Age)計(jì)數(shù)器(存在于對(duì)象頭中)。如果對(duì)象在Eden出生并經(jīng)過(guò)第一次MinorGC后仍然存活,并且能被Survivor容納的話(huà),將被移動(dòng)到Survwor空間中,并且對(duì)象年齡設(shè)為1。對(duì)象在Survivor區(qū)中每“熬過(guò)”一次MinorGC,年齡就增加1歲,當(dāng)它的年齡增加到一定程度(默認(rèn)為15歲),就將會(huì)被晉升到老年代中。對(duì)象晉升老年代的年齡閾值,可以通過(guò)參數(shù)-XX:MaxTenuringThreshoId設(shè)置。

動(dòng)態(tài)年齡判斷:為了能更好地適應(yīng)不同程序的內(nèi)存狀況,虛擬機(jī)并不是永遠(yuǎn)地要求對(duì)象的年齡必須達(dá)到了MaxTenuringThreshold才能晉升老年代,如果在Survivor空間中相同年齡所有對(duì)象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)人老年代,無(wú)須等到MaxTenuringThreshoId中要求的年齡。

空間分配擔(dān)保:在發(fā)生Minor GC之前,虛擬機(jī)會(huì)先檢查Survivor空間是否夠用,如果夠用則直接進(jìn)行Minor GC。否則進(jìn)行檢查老年代最大連續(xù)可用空間是否大于新生代的總和,假如大于,那么這個(gè)時(shí)候發(fā)生Minor GC是安全的。假如不大于,那么需要判斷HandlePromotionFailure設(shè)置是否允許擔(dān)保失敗。假如允許,則繼續(xù)判定老年代最大可用的連續(xù)空間是否大于平均晉升到老年代對(duì)象的平均值,如果大于,這個(gè)時(shí)候可以發(fā)生Minor GC ,如果小于或者設(shè)置HandlePromotionFailure不允許擔(dān)保失敗,則需要做一次Full GC。通常會(huì)把HandlePromotionFailure開(kāi)關(guān)打開(kāi),以減少Full GC。

對(duì)象何時(shí)進(jìn)入新生代、老年代

新分配的對(duì)象一般是直接進(jìn)入新生代的。但是如果出現(xiàn)以下的情況,會(huì)讓對(duì)象進(jìn)入老年代。

  • 1.新分配的對(duì)象占用空間大于-XX:PretenureSizeThreshold時(shí)直接分配到老年代
  • 2.MinorGC的時(shí)候,Survivor中的內(nèi)存不足了,允許分配擔(dān)保時(shí)會(huì)進(jìn)入老年代。
  • 3.MinorGC的時(shí)候,對(duì)象的年齡大于-XX:MaxTenuringThreshold(默認(rèn)為15)時(shí),進(jìn)入老年代。對(duì)象年齡存在于對(duì)象頭中,占4bit。
  • 4.當(dāng)進(jìn)行MinorGC的時(shí)候,如果在Survivor空間中相同年齡所有對(duì)象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)人老年代。

三種GC介紹

MinorGC

從年輕代空間(包括 Eden 和 Survivor 區(qū)域)回收內(nèi)存被稱(chēng)為 Minor GC,也叫Young GC。因?yàn)镴ava對(duì)象大多具備朝生夕死的特征,所以MinorGC非常頻繁,一般回收速度也比較快。一般采用復(fù)制算法。

Minor GC觸發(fā)條件

  • Eden區(qū)域滿(mǎn)了
  • 新生對(duì)象需要分配到新生代的Eden,當(dāng)Eden區(qū)的內(nèi)存不夠時(shí)需要進(jìn)行MinorGC

Major GC/Full GC:

MajorGC:是清理老年代,Major GC發(fā)生過(guò)程常常伴隨一次Minor

FullGC:Full GC可以看做是Major GC+Minor GC共同進(jìn)行的一整個(gè)過(guò)程,是清理整個(gè)堆空間(包括年輕代和老年代,這里不包含永久代,因?yàn)橛谰么贘DK7之前包含方法區(qū),是一塊與堆分離的區(qū)域;JDK7將靜態(tài)變量從永久代移到堆中;JDK8則完全取消永久代,方法區(qū)存在元空間MetaSpace中,雖然與堆共享一塊內(nèi)存,邏輯上可以認(rèn)為在堆中,但仍然與堆不相連)。Full GC的速度一般會(huì)比 Minor GC慢10倍以上。一般用的是標(biāo)記整理和標(biāo)記清除算法

Full GC觸發(fā)條件

  • 上面Minor GC時(shí)介紹中Survivor空間不足時(shí),判斷是否允許擔(dān)保失敗,如果不允許則進(jìn)行Full GC。如果允許,并且每次晉升到老年代的對(duì)象平均大小>老年代最大可用連續(xù)內(nèi)存空間,也會(huì)進(jìn)行Full GC。
  • MinorGC后存活的對(duì)象超過(guò)了老年代剩余空間
  • 方法區(qū)內(nèi)存不足時(shí)
  • System.gc(),可用通過(guò)-XX:+ DisableExplicitGC來(lái)禁止調(diào)用System.gc
  • CMS GC異常,CMS運(yùn)行期間預(yù)留的內(nèi)存無(wú)法滿(mǎn)足程序需要,就會(huì)出現(xiàn)一次“Concurrent Mode Failure”失敗,會(huì)觸發(fā)Full GC

圖示GC過(guò)程

1:初始階段,對(duì)象分配在Eden區(qū)(大對(duì)象直接進(jìn)入老年代,通過(guò)-XX:PretenureSizeThreshold配置),此時(shí)S0和S1是空的(圓圈中的數(shù)字代表對(duì)象的年齡)

2:當(dāng)Eden區(qū)滿(mǎn)了之后,進(jìn)行MinorGC,經(jīng)過(guò)掃描與標(biāo)記,不再存活的對(duì)象被清除,存活的對(duì)象進(jìn)入Survivor中的S0并且對(duì)象年齡+1,此時(shí)Eden被清空,S1是空的

3:然后隨著對(duì)象增多又一次MinorGC后,Eden區(qū)和S0區(qū)存活的對(duì)象進(jìn)入S1區(qū)并且對(duì)象年齡+1,Eden和S0區(qū)被清空

4:又一次MinorGC后,和上面步驟類(lèi)似,Eden區(qū)和S1區(qū)存活的對(duì)象進(jìn)入S0區(qū)并且對(duì)象年齡+1,Eden和S1區(qū)被清空

5:對(duì)象每熬過(guò)一次MinorGC其年齡就會(huì)加1,達(dá)到年齡閾值(可通過(guò)參數(shù)-XX:MaxTenuringThreshold配置)的年輕代對(duì)象會(huì)晉升到老年代,隨著進(jìn)入老年代的對(duì)象越來(lái)越多,當(dāng)老年代內(nèi)存不夠用時(shí)會(huì)發(fā)送MajorGC。

到此這篇關(guān)于解析Java內(nèi)存分配和回收策略以及MinorGC、MajorGC、FullGC的文章就介紹到這了,更多相關(guān)Java 內(nèi)存分配 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • break和continue的作用和區(qū)別解析(案例分析)

    break和continue的作用和區(qū)別解析(案例分析)

    break和continue都是用來(lái)控制循環(huán)結(jié)構(gòu)的,主要作用是停止循環(huán),這篇文章主要介紹了break和continue的作用和區(qū)別,需要的朋友可以參考下
    2023-03-03
  • Spring Boot快速入門(mén)教程

    Spring Boot快速入門(mén)教程

    本篇文章主要介紹了Spring Boot快速入門(mén)教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java函數(shù)習(xí)慣用法詳解

    Java函數(shù)習(xí)慣用法詳解

    本篇文章主要給大家總結(jié)了java中最常用的函數(shù)的用法和寫(xiě)法,需要的朋友參考一下吧。
    2017-12-12
  • java 中設(shè)計(jì)模式(裝飾設(shè)計(jì)模式)的實(shí)例詳解

    java 中設(shè)計(jì)模式(裝飾設(shè)計(jì)模式)的實(shí)例詳解

    這篇文章主要介紹了java 中設(shè)計(jì)模式(裝飾設(shè)計(jì)模式)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)聊天功能

    Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)聊天功能

    這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Springboot @WebFilter無(wú)法注入其他Bean的示例問(wèn)題

    Springboot @WebFilter無(wú)法注入其他Bean的示例問(wèn)題

    這篇文章主要介紹了Springboot @WebFilter無(wú)法注入其他Bean的示例問(wèn)題,本文通過(guò)示例代碼給大家分享解決方法,需要的朋友可以參考下
    2021-09-09
  • java實(shí)現(xiàn)斗地主發(fā)牌系統(tǒng)

    java實(shí)現(xiàn)斗地主發(fā)牌系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)斗地主發(fā)牌系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 使用Java模擬鼠標(biāo)和鍵盤(pán)的詳細(xì)操作步驟

    使用Java模擬鼠標(biāo)和鍵盤(pán)的詳細(xì)操作步驟

    這篇文章主要介紹了使用Java模擬鼠標(biāo)和鍵盤(pán)的詳細(xì)操作步驟,要運(yùn)行上面提供的Java程序,您需要遵循幾個(gè)步驟來(lái)設(shè)置Java環(huán)境、編寫(xiě)程序代碼,并執(zhí)行該程序,文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2024-05-05
  • 一篇文章讀懂Java哈希與一致性哈希算法

    一篇文章讀懂Java哈希與一致性哈希算法

    下面是小編為大家分享的關(guān)于哈希與一致性哈希算法的一篇文章,結(jié)合了大量圖片以及文字詳細(xì)講解,大家感興趣的可以自己參考一下
    2021-08-08
  • SpringBoot統(tǒng)一響應(yīng)和統(tǒng)一異常處理詳解

    SpringBoot統(tǒng)一響應(yīng)和統(tǒng)一異常處理詳解

    在開(kāi)發(fā)Spring Boot應(yīng)用時(shí),處理響應(yīng)結(jié)果和異常的方式對(duì)項(xiàng)目的可維護(hù)性、可擴(kuò)展性和團(tuán)隊(duì)協(xié)作有著至關(guān)重要的影響,統(tǒng)一結(jié)果返回和統(tǒng)一異常處理是提升項(xiàng)目質(zhì)量的關(guān)鍵策略之一,所以本文給大家詳細(xì)介紹了SpringBoot統(tǒng)一響應(yīng)和統(tǒng)一異常處理,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

礼泉县| 北票市| 江西省| 松江区| 区。| 中西区| 甘谷县| 郁南县| 射洪县| 奉节县| 宿州市| 鹰潭市| 永平县| 浙江省| 广水市| 宿松县| 潮州市| 长沙县| 邵阳市| SHOW| 西盟| 长岛县| 吴忠市| 晴隆县| 嘉峪关市| 息烽县| 洛南县| 临漳县| 卓资县| 尖扎县| 阿城市| 深州市| 鄂州市| 呈贡县| 吴江市| 城口县| 尤溪县| 增城市| 玛纳斯县| 手游| 孝感市|