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

Java GC垃圾回收算法分析

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

對象探活

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

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

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

缺點(diǎn):

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

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

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

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

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

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

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

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

// 強(qiáng)引用:只要引用可達(dá),就永遠(yuǎn)不會被回收
Object obj = new Object();
// 軟引用:堆內(nèi)存不夠時(shí)被回收
SoftReference<Object> softReference = new SoftReference<>(obj);
// 弱引用:只要觸發(fā)GC就會被回收
WeakReference<Object> weakReference = new WeakReference<>(obj);
/**
 * 虛引用:虛引用不會決定對象的生命周期,如果一個(gè)對象持有虛引用,那么和沒有引用一樣,get永遠(yuǎn)返回null。
 *
 * 需要配合引用隊(duì)列使用,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)虛引用時(shí),會將其加入到引用隊(duì)列中。
 *
 * 程序可以根據(jù)虛引用是否入隊(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)記可以回收的對象
  • 將被標(biāo)記的可回收對象進(jìn)行回收

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

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

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

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

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

缺點(diǎn):

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

標(biāo)記整理

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

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

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

缺點(diǎn):

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

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

新生代

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

循環(huán):

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

Eden + S1 -> S0

Eden + S0 -> S1

老年代

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    Jasypt對SpringBoot配置文件加密

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

    解決spring-boot 打成jar包后 啟動時(shí)指定參數(shù)無效的問題

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

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

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

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

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

最新評論

扶余县| 房产| 铜陵市| 桦南县| 玉环县| 清水河县| 宁强县| 贵州省| 洱源县| 青海省| 新源县| 清河县| 苏尼特右旗| 长子县| 江口县| 三门峡市| 正阳县| 定远县| 伊宁县| 广水市| 平泉县| 广元市| 托里县| 鄯善县| 顺昌县| 海林市| 建德市| 龙泉市| 台湾省| 隆安县| 葫芦岛市| 荔浦县| 崇文区| 稻城县| 梁山县| 香河县| 保山市| 孝义市| 青田县| 平安县| 日喀则市|