欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 垃圾回收機(jī)制以及經(jīng)典垃圾回收器詳解

 更新時(shí)間:2021年07月31日 11:27:29   作者:xiaoluo5238  
這篇文章主要介紹了java 垃圾回收機(jī)制以及經(jīng)典垃圾回收器詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

判斷對(duì)象存活方法

引用計(jì)數(shù)法:在對(duì)象中添加一個(gè)引用計(jì)數(shù)子,每當(dāng)一個(gè)地方引用他時(shí),計(jì)數(shù)器就加一,當(dāng)引用失效時(shí),計(jì)數(shù)器就減一。

會(huì)有對(duì)象循環(huán)引用問(wèn)題:

objA.instance = objB
objB.instance = objA

objA 有objB 的引用 objB 有 objA 的引用,他們相互引用著對(duì)方。導(dǎo)致他們無(wú)法回收。

可達(dá)性分析:

從GC Roots 根對(duì)象作為起點(diǎn),根據(jù)引用關(guān)系向下搜索,如果對(duì)象可達(dá),就說(shuō)明對(duì)象存活,如果對(duì)象不可達(dá),就說(shuō)明對(duì)象可以被回收。

GC Roots的根對(duì)象為:

1)在虛擬機(jī)棧 棧幀中的 本地變量表 中引用的對(duì)象

2)方法區(qū)靜態(tài)屬性引用的對(duì)象

3)方法區(qū)常量引用 的對(duì)象,如字符串常量池中的引用

4)本地方法棧中JNI引用的對(duì)象

5)虛擬機(jī)內(nèi)部引用的對(duì)象,如基本數(shù)據(jù)類(lèi)型對(duì)應(yīng)的Class對(duì)象,一些常駐的異常對(duì)象等,還有系統(tǒng)類(lèi)加載器

6)被同步鎖持有的對(duì)象

收集線程和用戶線程在并發(fā)可達(dá)性分析

并發(fā) 的可達(dá)性分析,由于用戶線程會(huì)即時(shí)修改對(duì)象的引用關(guān)系, 可能會(huì)造成兩種異常:

1)原本消亡的對(duì)象錯(cuò)誤標(biāo)記為存活,這個(gè)可以接受,就造成浮動(dòng)垃圾,下一次收集即可。

2)原本存活的對(duì)象 標(biāo)記為 消失。

三色法分析圖:

在這里插入圖片描述

黑色:已經(jīng)掃描過(guò)的對(duì)象

灰色:已經(jīng)訪問(wèn)過(guò),但還有一個(gè)引用沒(méi)有被掃描

白色:為被訪問(wèn)過(guò),若到最后還是白色,說(shuō)明此對(duì)象是需要回收的。

黑色誤標(biāo)記為白色有兩個(gè)條件

1)復(fù)制器插入一條或多條從黑色對(duì)象到白色對(duì)象的新引用

2)復(fù)制器刪除了全部從灰色對(duì)象到該白色對(duì)象的直接或間接的引用

解決方法:

1)增量更新,破壞條件1,把黑色對(duì)象對(duì)白色對(duì)象的新增引用記錄下來(lái),等并發(fā)掃描結(jié)束后,再以這些對(duì)象出發(fā)重新掃描。

2)原始快照(SATB),破解條件2,當(dāng)灰色對(duì)象要?jiǎng)h除對(duì)白色對(duì)象的引用關(guān)系時(shí),記錄下來(lái)。并發(fā)結(jié)束后再以記錄節(jié)點(diǎn)開(kāi)始重新掃描。

分代收集

堆:

新生代(1/3) 老年代(2/3)

新生代 分為 Eden/From/To

新生代存放:比較小,時(shí)長(zhǎng)比較小

老年代:比較大 存放時(shí)長(zhǎng)比較大

輕GC

重GC(full GC) -> STW(停止事件),fallGc特別費(fèi)資源

Eden -> from <-> To -> old

對(duì)象在from和to循環(huán)15(默認(rèn))次之后,會(huì)放到老年代

垃圾收集算法

標(biāo)記-清除 算法:

算法分為標(biāo)記 和 清除兩個(gè)階段,首先標(biāo)記出所需要回收的對(duì)象,標(biāo)記完成之后,統(tǒng)一回收所標(biāo)記的對(duì)象。

優(yōu)點(diǎn):最基礎(chǔ)的算法,實(shí)現(xiàn)簡(jiǎn)單

缺點(diǎn):1)執(zhí)行效率不穩(wěn)定,對(duì)象越多,效率越低

2)內(nèi)存碎片化,需要分配大對(duì)象時(shí)可能無(wú)足夠連續(xù)的空間。

代表垃圾收集器:

標(biāo)記復(fù)制算法(復(fù)制算法):

把內(nèi)存分為大小相等的兩塊,每次只使用其中一款,當(dāng)一塊快用完時(shí),它將存活的對(duì)象復(fù)制到另一塊上。

優(yōu)點(diǎn):能產(chǎn)生連續(xù)的空間

缺點(diǎn):耗內(nèi)存,對(duì)象存活率較高時(shí),效率會(huì)降低(不適合老年代)。

代表垃圾收集器: 很多新生代的回收,都用這種算法。

標(biāo)記整理 算法

首先標(biāo)記出所需要的對(duì)象,標(biāo)記完成后,對(duì)存活對(duì)象移動(dòng)到內(nèi)存的一段,然后清除邊界外的對(duì)象。

優(yōu)點(diǎn):有連續(xù)的內(nèi)存空間;系統(tǒng)吞吐量(用戶線程和收集器的效率總和)會(huì)提高。

缺點(diǎn):整理內(nèi)存耗時(shí)會(huì)比較大,會(huì)造成 “Stop The World”;

代表垃圾收集器:Parallel Scavenge收集器

CMS中主要用標(biāo)記清除算法,但是當(dāng)內(nèi)存碎片化到影響對(duì)象分配時(shí),就會(huì)使用一次標(biāo)記整理算法 去整理內(nèi)存碎片。

垃圾收集器

Serial收集器

最基礎(chǔ)最悠久的垃圾收集器,叫做 串行收集器,它進(jìn)行垃圾收集的時(shí)候,會(huì)停止用戶線程(Stop the world)。

新生代垃圾收集器用 Serial,基于復(fù)制算法

老年代垃圾收集器用 Serial Old,基于標(biāo)記整理算法。

在這里插入圖片描述

優(yōu)點(diǎn):所有垃圾收集器中內(nèi)存消耗最小的,對(duì)單核或單線程處理器來(lái)說(shuō),效率很高。運(yùn)行在客戶端

缺點(diǎn):stop the world

ParNew收集器

​ ParNew收集器就是Serial收集器的多線程并行版,除了支持多線并行收集之外,沒(méi)有太多創(chuàng)新之處。

在這里插入圖片描述

CMS垃圾收集器作為老年代垃圾收集器,不能與Parallel Scavenge配合工作,只能選擇 ParNew或者Serial收集器。

Parallel Scavenge收集器

新生代垃圾收集器,基于 標(biāo)記復(fù)制算法,也是可以通過(guò)并行收集的多線程收集器。他關(guān)注 吞吐量(用戶線程時(shí)間/總時(shí)間)。

在這里插入圖片描述

CMS 垃圾收集器

CMS 收集器是一種以獲取最短停頓時(shí)間作為目標(biāo)的垃圾收集器?;跇?biāo)記清除算法。

步驟:

初始標(biāo)記->并發(fā)標(biāo)記->重新標(biāo)記->并發(fā)清除

在這里插入圖片描述

1)初始標(biāo)記:stop the world,標(biāo)記GC ROOT 能直接關(guān)聯(lián)的對(duì)象,速度很快

2)并發(fā)標(biāo)記:從GC Root直接關(guān)聯(lián)的對(duì)象開(kāi)始遍歷整個(gè)對(duì)象圖,時(shí)間較長(zhǎng),但與用戶線程并行

3)重新標(biāo)記:stop the world,修正并發(fā)標(biāo)記期間對(duì)象的狀態(tài)的改變(增量更新算法,標(biāo)記新的黑色指向白色的引用),時(shí)間也比較短。

4)并發(fā)清除:與用戶線程同步。

優(yōu)點(diǎn):并發(fā)收集、低停頓。

缺點(diǎn):

1)對(duì)處理器資源敏感,當(dāng)處理器核心數(shù)量在四個(gè)以下時(shí),CMS對(duì)用戶程序影響很大。

2)有浮動(dòng)垃圾,并發(fā)標(biāo)記時(shí)會(huì)產(chǎn)生新的垃圾,但是CMS本次不會(huì)清理它,要等到下一次才會(huì)清理。從而可能造成內(nèi)存不夠而產(chǎn)生Stop the world 的Full GC

3)基于標(biāo)記清除算法,會(huì)產(chǎn)生大量的空間碎片,而觸發(fā)Full GC

G1垃圾收集器

關(guān)注吞吐量和延遲時(shí)間的最佳平衡。

從整體看,主要采用標(biāo)記整理算法,從局部看,是標(biāo)記-復(fù)制算法(兩個(gè)Region 之間的復(fù)制)。

G1把 java對(duì) 劃分為多個(gè)大小相等獨(dú)立區(qū)域 Region,每一個(gè)Region 都可以根據(jù)需要,扮演 Eden空間、Survivor空間或者老年代空間。

G1對(duì)年代的劃分存在概念上,它可以不是連續(xù)的區(qū)間。。

Region 還有一類(lèi)特殊的Humongous區(qū)域,專門(mén)存儲(chǔ)大對(duì)象(1M-32M,可配),把超過(guò)Region大小的對(duì)象分配在連續(xù)的 Humongous Region之中。

每次收集時(shí)以Region作為最小單元,G1收集器去根據(jù)Region里面垃圾隊(duì)的價(jià)值大小,在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,優(yōu)先處理回收價(jià)值收益最大的那些Region(每次收集到的內(nèi)存大小及回收時(shí)間的經(jīng)驗(yàn)值)。

G1至少耗費(fèi)打印java堆容量的10%到20%來(lái)維持收集工作。

TAMS指針:在并發(fā)過(guò)程中保存新建的對(duì)象。

STAB:灰色引用對(duì)白色引用的刪除 記錄下來(lái)。

G1的步驟:

1)初始標(biāo)記:stop the world,僅僅標(biāo)記GC ROOTs 能直接關(guān)聯(lián)的對(duì)象,并且修改TAMS指針

2)并發(fā)標(biāo)記:從GC ROOTS 直接關(guān)聯(lián)的對(duì)象出發(fā),掃描對(duì)象圖(并還要處理SATB記錄下并時(shí)有變動(dòng)的對(duì)象),時(shí)間長(zhǎng),但是與用戶線程并行,

3)最終標(biāo)記:stop the world,短暫,處理遺留下來(lái)的少量SATB記錄

4)帥選回收:stop the world,負(fù)責(zé)更新Region的統(tǒng)計(jì)數(shù)據(jù),對(duì)Region的回收價(jià)值和成本進(jìn)行排序。根據(jù)用戶所期望的停頓時(shí)間(JVM參數(shù)可配)來(lái)制定回收計(jì)劃??梢宰杂蛇x擇多個(gè)Region作為回收集,然后把存活的對(duì)象復(fù)制到空的Region中,然后清空回收集的Region。

除了并發(fā)標(biāo)記外,其它都用停止用戶線程,目標(biāo)不是單純的追求低延遲,而是延遲可控的情況下獲取最大的吞吐量(用戶線程時(shí)間/總時(shí)間,總時(shí)間為用戶線程時(shí)間+垃圾收集時(shí)間)。

在這里插入圖片描述

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解JAVA之運(yùn)算符

    詳解JAVA之運(yùn)算符

    這篇文章主要介紹了詳解Java中運(yùn)算符以及相關(guān)的用法講解,一起跟著小編學(xué)習(xí)下吧,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Java Cache詳解及簡(jiǎn)單實(shí)現(xiàn)

    Java Cache詳解及簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了 Java Cache詳解及簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java基礎(chǔ)之toString的序列化 匿名對(duì)象 復(fù)雜度精解

    Java基礎(chǔ)之toString的序列化 匿名對(duì)象 復(fù)雜度精解

    序列化即為把內(nèi)存中的對(duì)象轉(zhuǎn)換為字節(jié)寫(xiě)入文件或通過(guò)網(wǎng)絡(luò)傳輸?shù)竭h(yuǎn)端服務(wù)器,本章節(jié)將帶你了解Java toString的序列化 匿名對(duì)象 復(fù)雜度,需要的朋友可以參考下
    2021-09-09
  • 使用eclipse導(dǎo)入javaWeb項(xiàng)目的圖文教程

    使用eclipse導(dǎo)入javaWeb項(xiàng)目的圖文教程

    這篇文章主要介紹了如何使用eclipse導(dǎo)入別人的javaWeb項(xiàng)目,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java設(shè)計(jì)模式編程之工廠方法模式的使用

    Java設(shè)計(jì)模式編程之工廠方法模式的使用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程之工廠方法模式的使用,工廠方法模式屬于設(shè)計(jì)模式中三種工廠模式中的一種,需要的朋友可以參考下
    2016-02-02
  • 在Java的Spring框架中配置Quartz的教程

    在Java的Spring框架中配置Quartz的教程

    這篇文章主要介紹了在Java的Spring框架中配置Quartz的教程,Quartz是一款高人氣的開(kāi)源作業(yè)調(diào)度框架,需要的朋友可以參考下
    2016-03-03
  • Mybatis關(guān)聯(lián)映射舉例詳解

    Mybatis關(guān)聯(lián)映射舉例詳解

    關(guān)聯(lián)關(guān)系是面向?qū)ο蠓治觥⒚嫦驅(qū)ο笤O(shè)計(jì)最終的思想,Mybatis完全可以理解這種關(guān)聯(lián)關(guān)系,如果關(guān)系得當(dāng),Mybatis的關(guān)聯(lián)映射將可以大大簡(jiǎn)化持久層數(shù)據(jù)的訪問(wèn)
    2022-07-07
  • Java實(shí)現(xiàn)大文件的切割與合并操作示例

    Java實(shí)現(xiàn)大文件的切割與合并操作示例

    這篇文章主要介紹了Java實(shí)現(xiàn)大文件的切割與合并操作,結(jié)合實(shí)例形式分析了java基于io及util操作大文件按指定個(gè)數(shù)分割與合并相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java泛型在編譯時(shí)會(huì)發(fā)生類(lèi)型擦除,即泛型參數(shù)被替換為它們的限定類(lèi)型(如Object),這使得ArrayList<Integer>和ArrayList<String>在運(yùn)行時(shí)類(lèi)型相同,盡管如此,我們可以通過(guò)定義類(lèi)或匿名內(nèi)部類(lèi)的方式在運(yùn)行時(shí)獲取泛型信息
    2024-09-09
  • 關(guān)于Java中代碼塊的執(zhí)行順序

    關(guān)于Java中代碼塊的執(zhí)行順序

    這篇文章主要介紹了關(guān)于Java中代碼塊的執(zhí)行順序,構(gòu)造代碼塊是給所有對(duì)象進(jìn)行統(tǒng)一初始化,而構(gòu)造函數(shù)是給對(duì)應(yīng)的對(duì)象初始化,因?yàn)闃?gòu)造函數(shù)是可以多個(gè)的,運(yùn)行哪個(gè)構(gòu)造函數(shù)就會(huì)建立什么樣的對(duì)象,但無(wú)論建立哪個(gè)對(duì)象,都會(huì)先執(zhí)行相同的構(gòu)造代碼塊,需要的朋友可以參考下
    2023-08-08

最新評(píng)論