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

JVM的垃圾回收算法一起來(lái)看看

 更新時(shí)間:2022年03月08日 15:25:58   作者:吃魚的宗介  
這篇文章主要為大家詳細(xì)介紹了JVM的垃圾回收算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

垃圾回收算法

概念

垃圾回收(Garbage Collection,GC)。程序的運(yùn)行需要資源,無(wú)效的對(duì)象如果不及時(shí)清理就會(huì)一直占用資源,所以對(duì)內(nèi)存資源管理就變得十分重要。而Java為了讓我們更多的關(guān)注代碼本身,而不用過(guò)多的考慮內(nèi)存的釋放問(wèn)題,就有了我們十分熟悉的GC。然而當(dāng)垃圾回收成為系統(tǒng)達(dá)到更高并發(fā)量的瓶頸時(shí),我們就需要對(duì)這些自動(dòng)化的技術(shù)進(jìn)行一系列的監(jiān)控和調(diào)節(jié)。 

GC主要需要完成三件事情 :

哪些內(nèi)存需要回收?
什么時(shí)候回收?
如何回收?

哪些垃圾需要回收呢?這個(gè)時(shí)候我們?nèi)绾闻袛嗄男?duì)象“活著”,哪些對(duì)象“死去”?于是就有了標(biāo)記算法。

1.標(biāo)記算法

垃圾收集器中標(biāo)記算法有兩種,引用計(jì)數(shù)法和根可達(dá)算法

1.1 引用計(jì)數(shù)法(Reference Counting)

引用計(jì)數(shù)算法很簡(jiǎn)單,它實(shí)際上是通過(guò)在對(duì)象頭中分配一個(gè)空間來(lái)保存該對(duì)象被引用的次數(shù)。如果該對(duì)象被其它對(duì)象引用,則它的引用計(jì)數(shù)加1,如果刪除對(duì)該對(duì)象的引用,那么它的引用計(jì)數(shù)就減1,當(dāng)該對(duì)象的引用計(jì)數(shù)為0時(shí),那么該對(duì)象就會(huì)被回收。

如:

A objA = new A();
B objB = new B();
objA.ref = objB;

如圖:

在這里插入圖片描述

對(duì)象 A 的實(shí)例在Java堆中就是一塊內(nèi)存而已,而objA 做為一個(gè)局部變量引用了它,所以它的引用計(jì)數(shù)就是1,對(duì)象B的實(shí)例在堆中也是一塊內(nèi)存,objB這個(gè)局部變量引用了它,然后objA又引用了它一次,所以它的引用計(jì)數(shù)就是2。

客觀來(lái)說(shuō),引用計(jì)數(shù)算法 效率高,實(shí)現(xiàn)簡(jiǎn)單,然而,Java虛擬機(jī)沒(méi)有選取引用計(jì)數(shù)算法來(lái)管理內(nèi)存,主要是因?yàn)闊o(wú)法解決 循環(huán)引用的問(wèn)題。

如:

objA.ref= objB;
objB.ref= objA

如圖:

在這里插入圖片描述

實(shí)際上這兩個(gè)對(duì)象已經(jīng)不可能再被訪問(wèn),但是它們因?yàn)榛ハ嘁弥鴮?duì)方,導(dǎo)致它們的引用計(jì)數(shù)都不為0,于是這兩個(gè)對(duì)象都無(wú)法被GC回收。

1.2 可達(dá)性分析算法(Reachable Analysis)

在Java中是通過(guò)可達(dá)性分析算法來(lái)判斷對(duì)象是否存活的。選定一系列稱為"GC ROOTS"的對(duì)象作為起始點(diǎn),從這些對(duì)象向下搜索,搜索所走過(guò)的道路稱為引用鏈(Reference Chain).當(dāng)一個(gè)對(duì)象到GC ROOTS沒(méi)有任何引用鏈時(shí),則不可達(dá),這些對(duì)象會(huì)被判定可以回收。

如圖:

在這里插入圖片描述

在Java中,能作為GC Roots的對(duì)象包含以下幾種

虛擬機(jī)棧(棧幀中的本地變量表)中引用的對(duì)象
方法區(qū)中類靜態(tài)屬性引用的對(duì)象
方法區(qū)中常量引用的對(duì)象
本地方法棧JNI(即一般說(shuō)的Native方法)當(dāng)中引用的對(duì)象

2.回收算法

當(dāng)成功區(qū)分出哪些是存活對(duì)象哪些是死亡對(duì)象之后,GC接下來(lái)的任務(wù)就是執(zhí)行垃圾回收,釋放掉無(wú)用對(duì)象所占用的內(nèi)存空間,以便有足夠的可用內(nèi)存空間為新對(duì)象分配內(nèi)存。常用的垃圾回收算法有 標(biāo)記清除算法、復(fù)制算法、標(biāo)記壓縮算法。

2.1 標(biāo)記清除算法 (Mark Sweep)

標(biāo)記清除算法是最基礎(chǔ)的垃圾回收算法,同它的名字一樣,該算法有兩個(gè)過(guò)程,首先標(biāo)記哪些是可回收的對(duì)象,然后進(jìn)行內(nèi)存回收

標(biāo)記: Collector從引用根結(jié)點(diǎn)開(kāi)始遍歷,標(biāo)記所有被引用的對(duì)象。一般是在對(duì)象的Header中記錄為可達(dá)對(duì)象。

清除: Collector對(duì)堆內(nèi)存從頭到尾進(jìn)行線性的遍歷,如果發(fā)現(xiàn)某個(gè)對(duì)象在其Header中沒(méi)有標(biāo)記為可達(dá)對(duì)象,則將其回收。從網(wǎng)上找張圖給大家解釋一下,

如圖:

在這里插入圖片描述

缺點(diǎn):

1.效率不高,標(biāo)記過(guò)程和清除過(guò)程效率都一般

2.會(huì)產(chǎn)生很多空間碎片,可能會(huì)導(dǎo)致以后為大對(duì)象分配空間時(shí)因?yàn)檎也坏娇捎玫倪B續(xù)內(nèi)存空間不得不再次進(jìn)行GC。

2.2 復(fù)制算法(Copying)

GC復(fù)制算法(Copying GC)是由Marvin L. Minsky在1963年研究出來(lái)的算法。原理是把內(nèi)存分為兩個(gè)空間一個(gè)是From空間,一個(gè)是To空間,對(duì)象一開(kāi)始只在From空間分配,To空間是空閑的。GC時(shí)把存活的對(duì)象從From空間復(fù)制粘貼到To空間,之后把To空間變成新的From空間,原來(lái)的From空間變成To空間?;厥涨昂髮?duì)比下圖所示:

如圖:

在這里插入圖片描述

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

1.復(fù)制算法實(shí)現(xiàn)簡(jiǎn)單運(yùn)行高效,不會(huì)產(chǎn)生內(nèi)存碎片

2.但是將內(nèi)存縮小為原本的一半,代價(jià)略高。

現(xiàn)在虛擬機(jī)基本都采用這種垃圾回收算法回收新生代

2.3 標(biāo)記壓縮算法(Mark-Compact)

標(biāo)記壓縮算法(Mark-Compact),標(biāo)記過(guò)程和標(biāo)記清除算法的標(biāo)記過(guò)程一樣,但是清理過(guò)程不同,會(huì)將存活對(duì)象移動(dòng)到一端,然后清理掉端邊界之外的內(nèi)存,

如圖:

在這里插入圖片描述

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

標(biāo)記整理算法效率低,但不用浪費(fèi)內(nèi)存,也不會(huì)造成內(nèi)存碎片。

2.4 分代回收算法

在這里插入圖片描述

因?yàn)樾律鷮?duì)象大量死去,少量存活,一般采用復(fù)制算法。老年代存活率高,回收的少,一般采用MC/MS(標(biāo)記清除/標(biāo)記壓縮)

在這里插入圖片描述

如圖是我用arthas的dashboard命令輸出的本地的Memory信息。jdk1.8默認(rèn)的垃圾回收器是ps+po(這個(gè)之后講)??梢钥吹叫律笮。ㄒ恋閰^(qū)和s區(qū)),老年代大小。

2.4.1 新生代(Eden區(qū)/伊甸區(qū))

年輕代的對(duì)象處于一種“朝生夕死”的狀態(tài),在年輕代的GC叫做YGC(Minor GC)。Eden區(qū)對(duì)象活過(guò)第一次垃圾回收之后會(huì)進(jìn)入survivor區(qū)(S0S1/S1S2)。在S1,S2之間經(jīng)過(guò)多次垃圾回收進(jìn)入老年代。

-XX:MaxTenuringThreshold 可以配置多少次從年輕代進(jìn)入老年代

在這里插入圖片描述

在多線程那我們整過(guò)這張圖,再看一下,分代年齡只有4bit,意味著對(duì)象的最大年齡只有15-----可以通過(guò)上面的參數(shù)設(shè)置大小,最大15,之后要是沒(méi)有被gc就會(huì)進(jìn)入老年代。

2.4.2 老年代(tenured/old)

進(jìn)入老年代的對(duì)象大多數(shù)活過(guò)了年輕代的多次gc,因此不會(huì)頻繁死亡,老年代的GC叫做(Major GC)FULL GC。FGC的效率比YGC低的多,在老年代無(wú)法繼續(xù)分配空間的時(shí)候觸發(fā),觸發(fā)是新生代老年代一起進(jìn)行回收。

2.4.3 新生代何時(shí)進(jìn)入老年代

1. 超過(guò) XX:MaxTenuringThreshold 指定次數(shù)
2. 動(dòng)態(tài)年齡,S0->S1超過(guò)50%,把年齡最大的放到Old
3. 分配擔(dān)保:YGC期間,survivor區(qū)空間不夠了,空間擔(dān)保直接進(jìn)入老年代

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • 使用kotlin編寫spring cloud微服務(wù)的過(guò)程

    使用kotlin編寫spring cloud微服務(wù)的過(guò)程

    這篇文章主要介紹了使用kotlin編寫spring cloud微服務(wù)的相關(guān)知識(shí),本文給大家提到配置文件的操作代碼,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java SHA-256加密的兩種實(shí)現(xiàn)方法詳解

    Java SHA-256加密的兩種實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java SHA-256加密的兩種實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)SHA-256加密的實(shí)現(xiàn)代碼與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • java面試JDK8?new?ReentrantLock()加鎖流程解析

    java面試JDK8?new?ReentrantLock()加鎖流程解析

    這篇文章主要為大家介紹了java面試JDK8?new?ReentrantLock()加鎖流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java中的HashSet集合解析

    Java中的HashSet集合解析

    這篇文章主要介紹了Java中的HashSet集合解析,HashSet 實(shí)現(xiàn) Set 接口,內(nèi)部維護(hù)一個(gè) HashMap 實(shí)例,它不能保證集合迭代的順序,也不能保證順序不變,HashSet 允許 null 元素,需要的朋友可以參考下
    2023-11-11
  • java中常見(jiàn)的6種線程池示例詳解

    java中常見(jiàn)的6種線程池示例詳解

    這篇文章主要介紹了java中常見(jiàn)的6種線程池示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 基于SpringBoot+Redis實(shí)現(xiàn)分布式鎖

    基于SpringBoot+Redis實(shí)現(xiàn)分布式鎖

    本文主要介紹了基于SpringBoot+Redis實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java多線程之CyclicBarrier的使用方法

    java多線程之CyclicBarrier的使用方法

    這篇文章主要介紹了java多線程之CyclicBarrier的使用方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Java集合的定義與Collection類使用詳解

    Java集合的定義與Collection類使用詳解

    這篇文章主要介紹了Java集合的定義及Collection工具類使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • Java中String類(字符串操作)的10個(gè)常見(jiàn)問(wèn)題和解決方法

    Java中String類(字符串操作)的10個(gè)常見(jiàn)問(wèn)題和解決方法

    這篇文章主要介紹了Java中String類(字符串)操作的10個(gè)常見(jiàn)問(wèn)題,需要的朋友可以參考下
    2014-04-04
  • java編程實(shí)現(xiàn)并查集的路徑壓縮代碼詳解

    java編程實(shí)現(xiàn)并查集的路徑壓縮代碼詳解

    這篇文章主要介紹了java編程實(shí)現(xiàn)并查集的路徑壓縮代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考。
    2017-11-11

最新評(píng)論

原平市| 康定县| 绥德县| 枣庄市| 延津县| 南乐县| 禹州市| 阜阳市| 惠来县| 河源市| 梧州市| 云和县| 邳州市| 绥滨县| 瑞金市| 闽侯县| 杭锦旗| 彰化县| 从江县| 社旗县| 司法| 玉田县| 雷山县| 无锡市| 洛南县| 康定县| 白山市| 甘谷县| 武汉市| 博湖县| 山东省| 前郭尔| 河南省| 巩留县| 莒南县| 博罗县| 女性| 阜宁县| 郴州市| 攀枝花市| 鹤壁市|