衡阳派盒市场营销有限公司

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

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

3天內不再提示

JVM入門之垃圾回收算法

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

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

分類

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

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

垃圾收集器的設計原則

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

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

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

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

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

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

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

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

標記-清除算法

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

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

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

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

缺點

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

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

標記-復制算法

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

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

在這里插入圖片描述

“Apple回收策略”

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

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

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

缺點

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

標記-整理算法

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

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

缺點

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

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

在這里插入圖片描述

總結

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

采用標記-清除算法意味著 「內存碎片化」

采用標記-復制算法意味著 「內存可用度不高」 。

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

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

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

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

    關注

    23

    文章

    4630

    瀏覽量

    93356
  • 計數(shù)器
    +關注

    關注

    32

    文章

    2261

    瀏覽量

    94983
  • GC
    GC
    +關注

    關注

    0

    文章

    9

    瀏覽量

    17103
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12260
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

    JVM中自動檢測并移除不再使用的數(shù)據(jù)對象的這種機制稱為:垃圾回收,簡稱GC。JVM通過使用垃圾收集器及使用相應的
    發(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,導致 JVM 在弱內存模型的平臺上 Crash。在分析過程中,涉及到 CMS 垃圾回收原理、內存屏障、對象頭、以及 ParNew 并行回收
    的頭像 發(fā)表于 08-23 17:35 ?3468次閱讀

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

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

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

    JVM 垃圾回收機制是對堆中沒有使用的對象進行回收,那么判斷對象是否“存活”就至關重要。在判斷對象是否“存活”的方法中,我們會介紹引用計數(shù)算法
    的頭像 發(fā)表于 03-29 13:55 ?1538次閱讀
    詳解<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入門關于GC的擴展知識1

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

    JVM入門關于GC的擴展知識2

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

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

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

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

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

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

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

    jvm配置的mx

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

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

    導讀 JAVA簡單易用的特性,能夠讓研發(fā)人員在不了解JVM的底層運行機制的情況下依舊能夠編寫出功能完善的代碼。 但是對JVM的理解,是一個程序員普通和優(yōu)秀的分水嶺。全面地了解JVM的工作原理,能夠
    的頭像 發(fā)表于 08-20 15:25 ?289次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標記和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>算法</b>
    玩百家乐游戏的最高技巧| 百家乐赚水方| 盈乐博| 查找百家乐官网群| 大众百家乐娱乐城| 百家乐官网视频游戏中心| 366百家乐赌博| 丰顺县| 百家乐白茫茫| 网上百家乐官网洗码技巧| 利都百家乐国际娱乐网| 高手百家乐官网赢钱法| 百家乐牌| 百家乐官网微笑心法搜索| 迪威百家乐娱乐网| 网上百家乐官网开户送现金| 介绍百家乐赌博技巧| 波音网百家乐官网合作| 免费百家乐缩水| 百家乐官网凯时娱乐场| 大发888最新版本下载| 新西兰百家乐官网的玩法技巧和规则| 百家乐平台租用| 足球投注网站| 皇冠在线代理| 盛大百家乐的玩法技巧和规则| 百家乐官网投注网址| 大发888老虎机手机版下载安装| 百家乐官网筹码套装100片| 百家乐包赢| 联合百家乐的玩法技巧和规则 | 百家乐官网3号眨眼技术| 大发888ber| 德州百家乐官网21点桌| 伟德百家乐官网下载| 大发888娱乐场客户端| 百家乐投注方法多不多| 百家乐官网程序开户发| 旌德县| 云博国际| 威尼斯人娱乐城澳门赌博|