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

Java GC垃圾回收算法分析

 更新時(shí)間:2022年12月20日 10:55:06   作者:碼畜c  
垃圾回收機(jī)制簡(jiǎn)稱GC,主要用于Java堆的管理。在JVM中程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧生命周期隨跟隨線程,棧幀的進(jìn)棧和入棧能實(shí)現(xiàn)自動(dòng)清理。而 jdk8后元空間為本地內(nèi)存也不受GC控制,所以垃圾回收主要是在堆中

對(duì)象探活

在討論回收算法前,更為重要的問(wèn)題是如何判斷一個(gè)對(duì)象是否可以被回收?

引用計(jì)數(shù)算法

每個(gè)對(duì)象會(huì)維護(hù)一個(gè)count,當(dāng)有一個(gè)對(duì)象的屬性引用自己時(shí),count自增。當(dāng)為0時(shí),意味可被回收。

缺點(diǎn):

  • 需要頻繁執(zhí)行維護(hù)count的操作
  • 無(wú)法解決循環(huán)依賴問(wèn)題。比如下圖中的D與E節(jié)點(diǎn),已經(jīng)沒(méi)有其他對(duì)象的內(nèi)部在引用時(shí),應(yīng)該被判定為可回收對(duì)象。但是由于雙方相互引用,形成了循環(huán)依賴,無(wú)法被回收。

可達(dá)性分析(目前主流虛擬機(jī)垃圾回收器采取的算法):

將符合的GC Roots作為初始的存活對(duì)集合,以該集合中的Roots為起點(diǎn),探索所有能夠被Roots引用到的對(duì)象,并加入到Roots集合中,這個(gè)過(guò)程稱之為標(biāo)記。未被探索到的對(duì)象即是可回收對(duì)象(死亡的)。

優(yōu)點(diǎn):可以解決引用計(jì)數(shù)算法的循環(huán)依賴問(wèn)題。從GC Roots出發(fā),無(wú)法探測(cè)到循環(huán)依賴的對(duì)象,那么就會(huì)進(jìn)行回收。

那么什么樣的對(duì)象可以被作為Root對(duì)象(包括但不限于)

  • 局部變量表中的對(duì)象引用
  • 已被加載的靜態(tài)屬性引用的對(duì)象
  • 常量對(duì)象引用

強(qiáng)-軟-弱-虛引用

有些時(shí)候,我們有這樣一種需求,當(dāng)內(nèi)存足夠時(shí),會(huì)保留一些對(duì)象,方便后續(xù)調(diào)用。當(dāng)內(nèi)存不足時(shí),將這些對(duì)象回收,留出更多的內(nèi)存空間。系統(tǒng)的很多緩存功能符合上述條件。

// 強(qiáng)引用:只要引用可達(dá),就永遠(yuǎn)不會(huì)被回收
Object obj = new Object();
// 軟引用:堆內(nèi)存不夠時(shí)被回收
SoftReference<Object> softReference = new SoftReference<>(obj);
// 弱引用:只要觸發(fā)GC就會(huì)被回收
WeakReference<Object> weakReference = new WeakReference<>(obj);
/**
 * 虛引用:虛引用不會(huì)決定對(duì)象的生命周期,如果一個(gè)對(duì)象持有虛引用,那么和沒(méi)有引用一樣,get永遠(yuǎn)返回null。
 *
 * 需要配合引用隊(duì)列使用,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)虛引用時(shí),會(huì)將其加入到引用隊(duì)列中。
 *
 * 程序可以根據(jù)虛引用是否入隊(duì),來(lái)了解對(duì)象是否即將被垃圾回收,進(jìn)而執(zhí)行一些響應(yīng)操作。
 */
Object obj2 = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>(obj2, referenceQueue);
System.out.println(phantomReference.isEnqueued()); // false
obj2 = null;
System.gc();
Thread.sleep(500);
System.out.println(phantomReference.isEnqueued()); // true

標(biāo)記清除

  • 根據(jù)可達(dá)性分析,標(biāo)記可以回收的對(duì)象
  • 將被標(biāo)記的可回收對(duì)象進(jìn)行回收

內(nèi)存碎片問(wèn)題:造成了不連續(xù)的內(nèi)存碎片。當(dāng)有大對(duì)象需要存儲(chǔ)時(shí),若連續(xù)的碎片空間存儲(chǔ)不下, 難免會(huì)再次觸發(fā)垃圾回收的操作。

標(biāo)記復(fù)制

  • 保留一半的空間,每次只使用一半的空間。
  • 每次GC,根據(jù)可達(dá)性分析,將存活對(duì)象復(fù)制到另一片空間。
  • 釋放本次使用一半空間。

優(yōu)點(diǎn):

  • 只需針對(duì)一半的空間進(jìn)行回收。
  • 避免了內(nèi)存碎片問(wèn)題。
  • 只需要按順序分配內(nèi)存空間即可,實(shí)現(xiàn)簡(jiǎn)單。

缺點(diǎn):

  • 可使用的內(nèi)存空間縮減了一半。
  • 執(zhí)行時(shí)需要STW,導(dǎo)致掛起執(zhí)行的用戶線程

標(biāo)記整理

標(biāo)記清除的改進(jìn)

  • 根據(jù)可達(dá)性分析,對(duì)可以回收的對(duì)象進(jìn)行標(biāo)記
  • 將未被標(biāo)記的存活對(duì)象移動(dòng)到另一端,然后直接清理掉端邊界以外的內(nèi)存

優(yōu)點(diǎn):解決了標(biāo)記清除的內(nèi)存碎片問(wèn)題

缺點(diǎn):

  • 相比標(biāo)記清除的直接釋放,需要更多的時(shí)間來(lái)完成整理部分的操作
  • 執(zhí)行時(shí)需要STW,導(dǎo)致掛起執(zhí)行的用戶線程

回收算法的在堆內(nèi)存上的應(yīng)用

新生代

根據(jù)新生代的特點(diǎn),對(duì)象存活率較低,應(yīng)用標(biāo)記復(fù)制算法。分配內(nèi)存空間時(shí),使用Eden區(qū)與一塊Survivor區(qū),GC后將存活的對(duì)象放入到另一塊Survivor區(qū)。如果另一塊Survivor區(qū)不夠存放存活對(duì)象,多數(shù)情況下會(huì)使用老年代進(jìn)行分配擔(dān)保(分配擔(dān)保:將無(wú)法存儲(chǔ)的存活對(duì)象放入其他存儲(chǔ)空間)

循環(huán):

Eden + S0 -> S1 (將Eden 與 S0存活的對(duì)象復(fù)制到S1)

Eden + S1 -> S0

Eden + S0 -> S1

老年代

根據(jù)老年代的特點(diǎn),對(duì)象存活率較高,一般用標(biāo)記-清除,標(biāo)記-整理算法。

到此這篇關(guān)于Java GC垃圾回收算法分析的文章就介紹到這了,更多相關(guān)Java GC垃圾回收內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot + FreeMarker 實(shí)現(xiàn)動(dòng)態(tài)Word文檔導(dǎo)出功能

    Spring Boot + FreeMarker 實(shí)現(xiàn)動(dòng)態(tài)Word文檔導(dǎo)出功能

    Spring Boot與FreeMarker的組合,為開(kāi)發(fā)者提供了一個(gè)強(qiáng)大的平臺(tái),可以輕松實(shí)現(xiàn)動(dòng)態(tài)Word文檔的導(dǎo)出,本文將指導(dǎo)你如何使用Spring Boot與FreeMarker模板引擎,創(chuàng)建一個(gè)簡(jiǎn)單的應(yīng)用,用于根據(jù)數(shù)據(jù)庫(kù)數(shù)據(jù)動(dòng)態(tài)生成Word文檔并下載,感興趣的朋友一起看看吧
    2024-06-06
  • Java兩個(gè)List<T> 求交集,差集,并集,去重后的并集

    Java兩個(gè)List<T> 求交集,差集,并集,去重后的并集

    本文主要介紹了Java兩個(gè)List<T> 求交集,差集,并集,去重后的并集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot集成內(nèi)存數(shù)據(jù)庫(kù)hsqldb的實(shí)踐

    SpringBoot集成內(nèi)存數(shù)據(jù)庫(kù)hsqldb的實(shí)踐

    hsqldb只需要添加對(duì)應(yīng)的依賴,然后在配置文件進(jìn)行配置。不需要安裝一個(gè)數(shù)據(jù)庫(kù),本文就來(lái)介紹一下具體使用,感興趣的可以了解一下
    2021-09-09
  • Java反射與Fastjson的危險(xiǎn)反序列化詳解

    Java反射與Fastjson的危險(xiǎn)反序列化詳解

    在?Java?中,Computer.class是一個(gè)引用,它表示了?Computer?的字節(jié)碼對(duì)象(Class對(duì)象),這個(gè)對(duì)象被廣泛應(yīng)用于反射、序列化等操作中,那么為什么?parseObject?需要這個(gè)引用呢,帶著這個(gè)問(wèn)題我們一起通過(guò)本文學(xué)習(xí)下吧
    2024-07-07
  • SpringCloud?Hystrix?斷路器的實(shí)現(xiàn)

    SpringCloud?Hystrix?斷路器的實(shí)現(xiàn)

    本文主要介紹了SpringCloud?Hystrix?斷路器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • java并發(fā)編程專題(三)----詳解線程的同步

    java并發(fā)編程專題(三)----詳解線程的同步

    這篇文章主要介紹了JAVA并發(fā)編程 線程同步的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Jasypt對(duì)SpringBoot配置文件加密

    Jasypt對(duì)SpringBoot配置文件加密

    數(shù)據(jù)庫(kù)密碼直接明文寫在配置中,對(duì)安全來(lái)說(shuō),是一個(gè)很大的挑戰(zhàn)。一旦密碼泄漏,將會(huì)帶來(lái)很大的安全隱患。尤其在一些企業(yè)對(duì)安全性要求很高,因此我們就考慮如何對(duì)密碼進(jìn)行加密。本文著重介紹Jasypt對(duì)SpringBoot配置文件加密。
    2021-05-05
  • 解決spring-boot 打成jar包后 啟動(dòng)時(shí)指定參數(shù)無(wú)效的問(wèn)題

    解決spring-boot 打成jar包后 啟動(dòng)時(shí)指定參數(shù)無(wú)效的問(wèn)題

    這篇文章主要介紹了解決spring-boot 打成jar包后 啟動(dòng)時(shí)指定參數(shù)無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java?IDEA集成開(kāi)發(fā)工具中英文切換圖文教程

    Java?IDEA集成開(kāi)發(fā)工具中英文切換圖文教程

    相信很多小伙伴們剛接觸IDEA時(shí),看到一堆英文界面不知道如何下手,這篇文章主要給大家介紹了關(guān)于Java?IDEA集成開(kāi)發(fā)工具中英文切換的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Mybatis之@ResultMap,@Results,@Result注解的使用

    Mybatis之@ResultMap,@Results,@Result注解的使用

    這篇文章主要介紹了Mybatis之@ResultMap,@Results,@Result注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

白沙| 鹰潭市| 邹城市| 绥芬河市| 潢川县| 洪雅县| 呈贡县| 英德市| 蕉岭县| 安仁县| 叶城县| 江安县| 德清县| 天气| 萨嘎县| 灵宝市| 客服| 田东县| 三门峡市| 行唐县| 南康市| 乌兰察布市| 汽车| 赫章县| 盐山县| 海原县| 磐安县| 乐安县| 泸定县| 新丰县| 雷州市| 玉田县| 和硕县| 曲麻莱县| 吴忠市| 呼图壁县| 鲜城| 托里县| 正蓝旗| 且末县| 桂阳县|