0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM入門之垃圾回收算法

jf_78858299 ? 來源:北洋洋洋 ? 作者:北洋 ? 2023-02-10 11:40 ? 次閱讀

現(xiàn)有的垃圾回收算法

分類

根據(jù)如何判定對象是垃圾,垃圾回收算法分為兩類:1、 「引用計數(shù)式垃圾收集」 (判定垃圾是通過引用計數(shù)器)別名:直接垃圾收集 2、 「追蹤式垃圾收集」 (判定垃圾是通過GC Roots)別名:間接垃圾收集

主流虛擬機采用的是第二種追蹤式垃圾收集,所以本文講解第二種垃圾收集的算法

垃圾收集器的設(shè)計原則

根據(jù)兩個分代假說:

1.絕大部分對象是熬不過第一次垃圾回收的 2.熬過多次垃圾回收的對象是難以被標記為垃圾的。

垃圾收集器將堆中的內(nèi)存劃分為了不同的區(qū)域,根據(jù)對象分代年齡(熬過多少次垃圾回收)來分配到不同的區(qū)域中:

比如對象分代年齡小的,第一種對象就應(yīng)該 「標記存活對象」 即可,而不需要標記那些垃圾對象,因為這部分對象大部分都是很快用完就不用的垃圾對象。

而第二種對象分代年齡大的,則應(yīng)該標記的是垃圾對象,因為根據(jù)第二個假說這部分對象中垃圾對象的占比很少,所以垃圾回收的頻率也可以降低。

「將堆劃分為不同的區(qū)域后,垃圾回收器可以只回收其中一部分區(qū)域,針對每一部分區(qū)域也可以采用不同的算法來進行回收垃圾?!?/strong>

一般來說堆中至少會被劃分為“新生代”和“老年代”兩個區(qū)域。新生代存儲第一種假說類型的對象,老年代存放第二種假說類型的對象。

「注意」 :這種設(shè)計看起來是完美的,但是如果 「老年代中的對象引用了新生代中的對象」 這個時候年輕代發(fā)生垃圾回收時,除了需要遍歷GC Roots外,還需要 「遍歷整個老年代」 才會確保年輕代中的對象真正沒有對象引用。顯然這種遍歷整個老年代效率肯定會很低,所以采用了一種解決方案:讀者有興趣可以看看: 在這篇博客的末尾

標記-清除算法

最早出現(xiàn)的垃圾回收算法,之后出現(xiàn)的算法都是根據(jù)其缺點來進行演進的。

兩個階段:1. 「標記」 2.「清除」「標記需要回收的對象完成后進行統(tǒng)一回收所有被標記的對象, 也可以標記存活的對象統(tǒng)一回收沒有被標記的對象。」

「一,標記」 :如何判定對象是否是垃圾的過程在上一篇 博客 中已經(jīng)講解過,接著 「標記」 這些垃圾對象。

「二,清除」 :進行統(tǒng)一回收掉標記的對象。

缺點

1.當堆中的對象大部分是垃圾時, 「標記和清除的效率會變低」 ,而且會隨著內(nèi)存中垃圾對象的增長,導(dǎo)致效率越來越低。

  1. 「內(nèi)存碎片化」 :因為內(nèi)存分配不是連續(xù)的,所以當清除后,內(nèi)存中會存在大量內(nèi)存碎片。當遇到大對象分配內(nèi)存找不到足夠的連續(xù)的內(nèi)存來存放時會提前觸發(fā)GC。

標記-復(fù)制算法

采用的是“半?yún)^(qū)復(fù)制”的算法來實現(xiàn)的,即每次只使用其中的一部分內(nèi)存,當這部分內(nèi)存用完后將存活著的對象復(fù)制到另外一塊內(nèi)存上,接著清空剛才使用的那部分內(nèi)存,當另一部分內(nèi)存滿了的時候再用上一次清空后的那塊內(nèi)存往復(fù)。

解決了標記-清除的內(nèi)存碎片化問題,因為當發(fā)生GC時會進行全部清空,只將存活對象復(fù)制到另外一塊內(nèi)存中。

在這里插入圖片描述

“Apple回收策略”

Andrew Appel針對剛剛分代假說中的第一條,提出了“Appel式回收策略”。

一般情況下百分之九十八的對象在經(jīng)歷第一次gc時就會被清除。因此做出優(yōu)化將年輕代分為了 「一塊eden空間和兩塊Survival空間」 。enen和Survival內(nèi)存占比為 「8:1」 ,即每次使用百分之九十的內(nèi)存, 「只有百分之十的內(nèi)存會被浪費」 ,因為對象大部分都會死去所以沒有必要分配一半的空間來存放存活對象。

但是如果使用百分之十的內(nèi)存來存放存活對象,當存活對象在Survival空間存放不下時,這個時候就需要用老年代擔保,因此當存不下時會存放到老年代中。

缺點

1.當內(nèi)存中的對象存活率較高時,復(fù)制大量存活對象會使得效率變低。2.如果不想造成嚴重的內(nèi)存浪費,就需要有額外的空間進行分配。

標記-整理算法

上面所說的標記-復(fù)制算法針對與新生代中進行的回收算法,并不適用與老年代,原因:老年代中存活率較高,存放不下時需要額外的內(nèi)存空間擔保。

因此出現(xiàn)了標記-整理算法, 和標記-復(fù)制算法相同的是: 「標記的都是存活對象」 ;和標記-復(fù)制算法不同的是: 「復(fù)制算法將存活對象復(fù)制到另外一塊內(nèi)存上然后清除之前使用的內(nèi)存,而整理算法是移動存活的對象到一端,然后清除邊界以外的內(nèi)存」 。

缺點

「移動存活對象」 :對于老年代中GC之后大部分都為存活對象,將這些對象都進行移動并且更新引用這些對象的地方是一個比較耗時的操作。而且更新引用需要暫停用戶線程來保證用戶線程訪問對象不會出錯,簡稱STW,"Stop the Word"。

其實不止整理算法里面移動對象更新引用需要STW,清除算法和復(fù)制算法中的標記清除都需要STW,只不過時間短

在這里插入圖片描述

總結(jié)

采用標記-整理算法意味著GC的時候要移動對象更新對象的引用,也就是說 「內(nèi)存回收的時候會更復(fù)雜」 。

采用標記-清除算法意味著 「內(nèi)存碎片化」

采用標記-復(fù)制算法意味著 「內(nèi)存可用度不高」 。

“吞吐量”:賦值器(使用垃圾回收器的線程也就是用戶線程)與垃圾回收器的效率總和。

因為 「內(nèi)存分配和訪問(內(nèi)存碎片化導(dǎo)致過多的分配和訪問)比垃圾回收器回收的頻率(回收時需要STW,而且比較耗時)要高」 ,因此整理這種方式其實吞吐量要比清除要好。

對于關(guān)注吞吐量的收集器Parallel Scabenge基于標記-整理算法, 對于關(guān)注STW的收集器CMS來說采用的是標記-清除算法。其實CMS是一種將兩種算法混合起來的收集器,大部分時間采用清除算法,只有當分配內(nèi)存不足(碎片化特別嚴重)時用整理算法進行一次收集。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4576

    瀏覽量

    92341
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2248

    瀏覽量

    94179
  • GC
    GC
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    17069
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    157

    瀏覽量

    12188
收藏 人收藏

    評論

    相關(guān)推薦

    垃圾回收算法——標記清除算法

    (35講)垃圾回收算法——標記清除算法
    發(fā)表于 04-29 15:12

    固態(tài)硬盤垃圾回收方法

    。特別是對于頻繁使用的有數(shù)據(jù)碎片的SSD,垃圾回收帶來的性能下降問題將更為嚴重,現(xiàn)有的垃圾回收(GC)算法各自側(cè)重
    發(fā)表于 12-03 10:50 ?2次下載
    固態(tài)硬盤<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>方法

    基于邏輯區(qū)間熱度的垃圾回收算法

    針對現(xiàn)有的NAND閃存垃圾回收算法回收性能不高,磨損均衡效果差,并且算法內(nèi)存開銷大的問題,提出了一種基于邏輯區(qū)間熱度的
    發(fā)表于 12-05 18:27 ?0次下載
    基于邏輯區(qū)間熱度的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>算法</b>

    Jvm垃圾回收機制及性能調(diào)優(yōu)實戰(zhàn)

    JVM中自動檢測并移除不再使用的數(shù)據(jù)對象的這種機制稱為:垃圾回收,簡稱GC。JVM通過使用垃圾收集器及使用相應(yīng)的
    發(fā)表于 04-03 14:31 ?2次下載

    基于頁合并更新的NAND Flash垃圾回收算法研究

    基于頁合并更新的NAND Flash垃圾回收算法研究(android嵌入式開發(fā)高德)-該文檔為基于頁合并更新的NAND Flash垃圾回收
    發(fā)表于 07-30 12:19 ?10次下載
    基于頁合并更新的NAND Flash<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>算法</b>研究

    如何解決JVM中一個極小概率發(fā)生的bug

    到 CMS 代碼存在 bug,導(dǎo)致 JVM 在弱內(nèi)存模型的平臺上 Crash。在分析過程中,涉及到 CMS 垃圾回收原理、內(nèi)存屏障、對象頭、以及 ParNew 并行回收
    的頭像 發(fā)表于 08-23 17:35 ?3334次閱讀

    帶顏色的JVM垃圾回收三色標記法

    三色標記法是一種垃圾回收法,它可以讓JVM不發(fā)生或僅短時間發(fā)生STW(Stop The World),從而達到清除JVM內(nèi)存垃圾的目的。
    的頭像 發(fā)表于 10-20 14:23 ?1573次閱讀

    詳解JVM垃圾回收算法垃圾回收

    JVM 垃圾回收機制是對堆中沒有使用的對象進行回收,那么判斷對象是否“存活”就至關(guān)重要。在判斷對象是否“存活”的方法中,我們會介紹引用計數(shù)算法
    的頭像 發(fā)表于 03-29 13:55 ?1439次閱讀
    詳解<b class='flag-5'>JVM</b>的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>算法</b>和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>器

    JVM入門關(guān)于GC的擴展知識1

    本章主要是對上一篇文章講的垃圾回收機制的擴展,垃圾回收其實本身是有很多可以優(yōu)化的點的,本章就進行對這些優(yōu)化點進行介紹。
    的頭像 發(fā)表于 02-10 11:35 ?522次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b>關(guān)于GC的擴展知識1

    JVM入門關(guān)于GC的擴展知識2

    本章主要是對上一篇文章講的垃圾回收機制的擴展,垃圾回收其實本身是有很多可以優(yōu)化的點的,本章就進行對這些優(yōu)化點進行介紹。
    的頭像 發(fā)表于 02-10 11:35 ?529次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b>關(guān)于GC的擴展知識2

    詳細解析JVM中的垃圾回收機制

    Java語言的一大優(yōu)勢在于其具有自動垃圾回收(Garbage Collection,GC)機制,讓開發(fā)者無需關(guān)心內(nèi)存的分配與釋放。
    的頭像 發(fā)表于 06-06 16:53 ?1915次閱讀

    垃圾收集器的JVM參數(shù)配置

    本篇文章我們就來給大家介紹垃圾收集器的 JVM 參數(shù)配置。 JVM參數(shù)有很多,其實我們直接使用默認的JVM參數(shù),不去修改都可以滿足大多數(shù)情況。但是如果你想在有限的硬件資源下,部署的系統(tǒng)
    的頭像 發(fā)表于 10-09 16:35 ?502次閱讀
    <b class='flag-5'>垃圾</b>收集器的<b class='flag-5'>JVM</b>參數(shù)配置

    jvm參數(shù)的設(shè)置和jvm調(diào)優(yōu)

    。 -XX:SurvivorRatio:設(shè)置Eden區(qū)與Survivor區(qū)的大小比例。 -XX:MaxPermSize:設(shè)置永久代的大小。 垃圾回收參數(shù)
    的頭像 發(fā)表于 12-05 11:36 ?1251次閱讀

    jvm配置的mx

    用于設(shè)置JVM的最大堆內(nèi)存大小,即堆的上限。當堆內(nèi)存不足時,JVM會觸發(fā)垃圾回收機制以釋放內(nèi)存。如果垃圾
    的頭像 發(fā)表于 12-05 14:24 ?634次閱讀

    從原理聊JVM(一):染色標記和垃圾回收算法

    導(dǎo)讀 JAVA簡單易用的特性,能夠讓研發(fā)人員在不了解JVM的底層運行機制的情況下依舊能夠編寫出功能完善的代碼。 但是對JVM的理解,是一個程序員普通和優(yōu)秀的分水嶺。全面地了解JVM的工作原理,能夠
    的頭像 發(fā)表于 08-20 15:25 ?137次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標記和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>算法</b>