色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

Linux愛好者 ? 來源:博客 ? 作者:等不到的口琴 ? 2021-10-20 14:23 ? 次閱讀

三色標記法是一種垃圾回收法,它可以讓JVM不發生或僅短時間發生STW(Stop The World),從而達到清除JVM內存垃圾的目的。JVM中的CMS、G1垃圾回收器所使用垃圾回收算法即為三色標記法。

三色標記算法思想三色標記法將對象的顏色分為了黑、灰、白,三種顏色。

白色:該對象沒有被標記過。(對象垃圾)

灰色:該對象已經被標記過了,但該對象下的屬性沒有全被標記完。(GC需要從此對象中去尋找垃圾)

黑色:該對象已經被標記過了,且該對象下的屬性也全部都被標記過了。(程序所需要的對象)

算法流程

從我們main方法的根對象(JVM中稱為GC Root)開始沿著他們的對象向下查找,用黑灰白的規則,標記出所有跟GC Root相連接的對象,掃描一遍結束后,一般需要進行一次短暫的STW(Stop The World),再次進行掃描,此時因為黑色對象的屬性都也已經被標記過了。

所以只需找出灰色對象并順著繼續往下標記(且因為大部分的標記工作已經在第一次并發的時候發生了,所以灰色對象數量會很少,標記時間也會短很多), 此時程序繼續執行,GC線程掃描所有的內存,找出掃描之后依舊被標記為白色的對象(垃圾),清除。

具體流程:

首先創建三個集合:白、灰、黑。

將所有對象放入白色集合中。

然后從根節點開始遍歷所有對象(注意這里并不遞歸遍歷),把遍歷到的對象從白色集合放入灰色集合。

之后遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,之后將此灰色對象放入黑色集合

重復 4 直到灰色中無任何對象

通過write-barrier檢測對象有變化,重復以上操作

收集所有白色對象(垃圾)

三色標記存在問題

浮動垃圾:并發標記的過程中,若一個已經被標記成黑色或者灰色的對象,突然變成了垃圾,由于不會再對黑色標記過的對象重新掃描,所以不會被發現,那么這個對象不是白色的但是不會被清除,重新標記也不能從GC Root中去找到,所以成為了浮動垃圾,浮動垃圾對系統的影響不大,留給下一次GC進行處理即可。

對象漏標問題(需要的對象被回收):并發標記的過程中,一個業務線程將一個未被掃描過的白色對象斷開引用成為垃圾(刪除引用),同時黑色對象引用了該對象(增加引用)(這兩部可以不分先后順序);因為黑色對象的含義為其屬性都已經被標記過了,重新標記也不會從黑色對象中去找,導致該對象被程序所需要,卻又要被GC回收,此問題會導致系統出現問題,而CMS與G1,兩種回收器在使用三色標記法時,都采取了一些措施來應對這些問題,CMS對增加引用環節進行處理(Increment Update),G1則對刪除引用環節進行處理(SATB)。

解決辦法在JVM虛擬機中有兩種常見垃圾回收器使用了該算法:CMS(Concurrent Mark Sweep)、G1(Garbage First) ,為了解決三色標記法對對象漏標問題各自有各自的法:

CMS回顧

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的Java應用集中在互聯網網站或者基于瀏覽器的B/S系統的服務端上,這類應用通常都會較為關注服務的響應速度,希望系統停頓時間盡可能短,以給用戶帶來良好的交互體驗。CMS收集器就非常符合這類應用的需求(但是實際由于某些問題,很少有使用CMS作為主要垃圾回收器的)。

從名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于標記-清除算法實現的,它的運作過程相對于前面幾種收集器來說要更復雜一些,整個過程分為四個步驟,包括:1)初始標記(CMS initial mark) 2)并發標記(CMS concurrent mark) 3)重新標記(CMS remark) 4)并發清除(CMS concurrent sweep)

其中初始標記、重新標記這兩個步驟仍然需要“Stop The World”。初始標記僅僅只是標記一下GCRoots能直接關聯到的對象,速度很快;

并發標記階段就是從GC Roots的直接關聯對象開始遍歷整個對象圖的過程,這個過程耗時較長但是不需要停頓用戶線程,可以與垃圾收集線程一起并發運行;

重新標記階段則是為了修正并發標記期間,因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間通常會比初始標記階段稍長一些,但也遠比并發標記階段的時間短;

最后是并發清除階段,清理刪除掉標記階段判斷的已經死亡的對象,由于不需要移動存活對象,所以這個階段也是可以與用戶線程同時并發的。由于在整個過程中耗時最長的并發標記和并發清除階段中,垃圾收集器線程都可以與用戶線程一起工作,所以從總體上來說,CMS收集器的內存回收過程是與用戶線程一起并發執行的。

CMS解決辦法:增量更新

在應對漏標問題時,CMS使用了增量更新(Increment Update)方法來做:

在一個未被標記的對象(白色對象)被重新引用后,引用它的對象若為黑色則要變成灰色,在下次二次標記時讓GC線程繼續標記它的屬性對象。

但是就算時這樣,其仍然是存在漏標的問題:

在一個灰色對象正在被一個GC線程回收時,當它已經被標記過的屬性指向了一個白色對象(垃圾)

而這個對象的屬性對象本身還未全部標記結束,則為灰色不變

而這個GC線程在標記完最后一個屬性后,認為已經將所有的屬性標記結束了,將這個灰色對象標記為黑色,被重新引用的白色對象,無法被標記

CMS另兩個致命缺陷

CMS采用了Mark-Sweep算法,最后會產生許多內存碎片,當到一定數量時,CMS無法清理這些碎片了,CMS會讓Serial Old垃圾處理器來清理這些垃圾碎片,而Serial Old垃圾處理器是單線程操作進行清理垃圾的,效率很低。

所以使用CMS就會出現一種情況,硬件升級了,卻越來越卡頓,其原因就是因為進行Serial Old GC時,效率過低。

解決方案:使用Mark-Sweep-Compact算法,減少垃圾碎片

調優參數(配套使用):

-XX:+UseCMSCompactAtFullCollection 開啟CMS的壓縮

-XX:CMSFullGCsBeforeCompaction 默認為0,指經過多少次CMS FullGC才進行壓縮

當JVM認為內存不夠,再使用CMS進行并發清理內存可能會發生OOM的問題,而不得不進行Serial Old GC,Serial Old是單線程垃圾回收,效率低

解決方案:降低觸發CMS GC的閾值,讓浮動垃圾不那么容易占滿老年代

調優參數:

-XX:CMSInitiatingOccupancyFraction 92% 可以降低這個值,讓老年代占用率達到該值就進行CMS GC

G1回顧

G1(Garbage First)物理內存不再分代,而是由一塊一塊的Region組成,但是邏輯分代仍然存在。G1不再堅持固定大小以及固定數量的分代區域劃分,而是把連續的Java堆劃分為多個大小相等的獨立區域(Region),每一個Region都可以根據需要,扮演新生代的Eden空間、Survivor空間,或者老年代空間。收集器能夠對扮演不同角色的Region采用不同的策略去處理,這樣無論是新創建的對象還是已經存活了一段時間、熬過多次收集的舊對象都能獲取很好的收集效果。

Region中還有一類特殊的Humongous區域,專門用來存儲大對象。G1認為只要大小超過了一個Region容量一半的對象即可判定為大對象。每個Region的大小可以通過參數-XX:G1HeapRegionSize設定,取值范圍為1MB~32MB,且應為2的N次冪。而對于那些超過了整個Region容量的超級大對象,將會被存放在N個連續的Humongous Region之中,G1的大多數行為都把Humongous Region作為老年代的一部分來進行看待

G1前置知識

Card Table(多種垃圾回收器均具備)

由于在進行YoungGC時,我們在進行對一個對象是否被引用的過程,需要掃描整個Old區,所以JVM設計了CardTable,將Old區分為一個一個Card,一個Card有多個對象;如果一個Card中的對象有引用指向Young區,則將其標記為Dirty Card,下次需要進行YoungGC時,只需要去掃描Dirty Card即可。

Card Table 在底層數據結構以 Bit Map實現。

RSet(Remembered Set)

是輔助GC過程的一種結構,典型的空間換時間工具,和Card Table有些類似。

后面說到的CSet(Collection Set)也是輔助GC的,它記錄了GC要收集的Region集合,集合里的Region可以是任意年代的。

在GC的時候,對于old-》young和old-》old的跨代對象引用,只要掃描對應的CSet中的RSet即可。邏輯上說每個Region都有一個RSet,RSet記錄了其他Region中的對象引用本Region中對象的關系,屬于points-into結構(誰引用了我的對象)。

而Card Table則是一種points-out(我引用了誰的對象)的結構,每個Card 覆蓋一定范圍的Heap(一般為512Bytes)。G1的RSet是在Card Table的基礎上實現的:每個Region會記錄下別的Region有指向自己的指針,并標記這些指針分別在哪些Card的范圍內。這個RSet其實是一個Hash Table,Key是別的Region的起始地址,Value是一個集合,里面的元素是Card Table的Index。每個Region中都有一個RSet,記錄其他Region到本Region的引用信息;使得垃圾回收器不需要掃描整個堆找到誰引用當前分區中的對象,只需要掃描RSet即可。

CSet(Collection Set)

一組可被回收的分區Region的集合, 是多個對象的集合內存區域。

新生代與老年代的比例

5% - 60%,一般不使用手工指定,因為這是G1預測停頓時間的基準,這地方簡要說明一下,G1可以指定一個預期的停頓時間,然后G1會根據你設定的時間來動態調整年輕代的比例,例如時間長,就將年輕代比例調小,讓YGC盡早行。

G1解決辦法:SATB

SATB(Snapshot At The Beginning), 在應對漏標問題時,G1使用了SATB方法來做,具體流程:

在開始標記的時候生成一個快照圖標記存活對象

在一個引用斷開后,要將此引用推到GC的堆棧里,保證白色對象(垃圾)還能被GC線程掃描到(在**write barrier(寫屏障)**里把所有舊的引用所指向的對象都變成非白的)。

配合Rset,去掃描哪些Region引用到當前的白色對象,若沒有引用到當前對象,則回收

SATB詳細流程

SATB是維持并發GC的一種手段。G1并發的基礎就是SATB。SATB可以理解成在GC開始之前對堆內存里的對象做一次快照,此時活的對像就認為是活的,從而開成一個對象圖。

在GC收集的時候,新生代的對象也認為是活的對象,除此之外其他不可達的對象都認為是垃圾對象。

如何找到在GC過程中分配的對象呢?每個region記錄著兩個top-at-mark-start(TAMS)指針,分別為prevTAMS和nextTAMS。在TAMS以上的對象就是新分配的,因而被視為隱式marked。

通過這種方式我們就找到了在GC過程中新分配的對象,并把這些對象認為是活的對象。

解決了對象在GC過程中分配的問題,那么在GC過程中引用發生變化的問題怎么解決呢?

G1給出的解決辦法是通過Write Barrier。Write Barrier就是對引用字段進行賦值做了額外處理。通過Write Barrier就可以了解到哪些引用對象發生了什么樣的變化。

mark的過程就是遍歷heap標記live object的過程,采用的是三色標記算法,這三種顏色為white(表示還未訪問到)、gray(訪問到但是它用到的引用還沒有完全掃描)、back(訪問到而且其用到的引用已經完全掃描完)。

整個三色標記算法就是從GC roots出發遍歷heap,針對可達對象先標記white為gray,然后再標記gray為black;遍歷完成之后所有可達對象都是balck的,所有white都是可以回收的。

SATB僅僅對于在marking開始階段進行“snapshot”(marked all reachable at mark start),但是concurrent的時候并發修改可能造成對象漏標記。

對black新引用了一個white對象,然后又從gray對象中刪除了對該white對象的引用,這樣會造成了該white對象漏標記。

對black新引用了一個white對象,然后從gray對象刪了一個引用該white對象的white對象,這樣也會造成了該white對象漏標記。

對black新引用了一個剛new出來的white對象,沒有其他gray對象引用該white對象,這樣也會造成了該white對象漏標記。

SATB效率高于增量更新的原因?

因為SATB在重新標記環節只需要去重新掃描那些被推到堆棧中的引用,并配合Rset來判斷當前對象是否被引用來進行回收;

并且在最后G1并不會選擇回收所有垃圾對象,而是根據Region的垃圾多少來判斷與預估回收價值(指回收的垃圾與回收的STW時間的一個預估值),將一個或者多個Region放到CSet中,最后將這些Region中的存活對象壓縮并復制到新的Region中,清空原來的Region。

G1會不會進行Full GC?

會,當內存滿了的時候就會進行Full GC;且JDK10之前的Full GC,為單線程的,所以使用G1需要避免Full GC的產生。

解決方案:

加大內存;

提高CPU性能,加快GC回收速度,而對象增加速度趕不上回收速度,則Full GC可以避免;

降低進行Mixed GC觸發的閾值,讓Mixed GC提早發生(默認45%)

編輯:jq

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

    關注

    68

    文章

    10901

    瀏覽量

    212664
  • cms
    cms
    +關注

    關注

    0

    文章

    60

    瀏覽量

    10996
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12252

原文標題:帶顏色的 JVM:三色標記詳解

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    JTW90215如何一鍵實現三色無極調光?

    JTW90215是一顆單鍵三色無極調光電容觸摸芯片,具有高靈敏度,觸摸響應快,默認輸出低電平,循環輸出模式。可用于化妝鏡,臺燈等領域,其在防水抗干擾方面具有優異的表現。管腳定義應用電路功能描述觸摸
    的頭像 發表于 12-11 17:14 ?213次閱讀
    JTW90215如何一鍵實現<b class='flag-5'>三色</b>無極調光?

    一文分析分析三色調光臺燈的電路原理

    這個電路,出自一款在某電商平臺賣爆了的LED臺燈。 價格便宜,功能簡單實用: 所謂三色調光,是指支持種燈光顏色,同時支持光的亮度調節。 下面用張gif動圖感受一下是怎么操作的。 1
    的頭像 發表于 11-29 09:28 ?5766次閱讀
    一文分析分析<b class='flag-5'>三色</b>調光臺燈的電路原理

    【星閃派物聯網開發套件體驗連載】核心板三色

    接上文【星閃派物聯網開發套件體驗連載】開發環境搭建 核心主板W63E通過GPIO 5腳與SK6812 三色燈 DI相連 SK6812 三色燈 資料: `fbb_ws63SDK包含此三色燈程序,將
    發表于 10-07 09:40

    led燈突然一種顏色不亮的原因及解決辦法

    當雙LED燈突然一種顏色不亮時,可能的原因有多種,以下是一些可能的原因及相應的解決方法:
    的頭像 發表于 10-01 17:15 ?3205次閱讀

    智能回收箱的功能和使用步驟介紹

    智能回收箱是現代城市環保與資源循環利用領域的一項創新技術,它通過集成各種智能化功能,提高了垃圾回收的效率和準確性,促進了垃圾分類與減量。隨著全球對環境保護意識的增強和智慧城市概念的推廣
    的頭像 發表于 09-23 14:34 ?1053次閱讀
    智能<b class='flag-5'>回收</b>箱的功能和使用步驟介紹

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

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

    OPT4048 高速高精度三色 XYZ 顏色傳感器數據表

    電子發燒友網站提供《OPT4048 高速高精度三色 XYZ 顏色傳感器數據表.pdf》資料免費下載
    發表于 08-12 10:46 ?0次下載
    OPT4048 高速高精度<b class='flag-5'>三色</b> XYZ <b class='flag-5'>顏色</b>傳感器數據表

    智能垃圾回收箱功能實驗

    需要系統地介紹智能垃圾回收箱軟件硬件設計完成后的設備運行狀況,包括正常工作和問題調試。同時,也要描述當所有設備正常工作時智能垃圾回收箱的操作流程。01硬件模塊的試驗在智能
    的頭像 發表于 05-24 08:10 ?493次閱讀
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱功能實驗

    Vidda C2系列三色激光投影機獲TüV萊茵高畫質和護眼相關驗證聲明

    上海2024年5月9日?/美通社/ -- 近日,國際獨立第方檢測、檢驗和認證機構德國萊茵TüV大中華區(簡稱"TüV萊茵")為海信旗下Vidda C2系列三色激光投影機,包括VL7N-ULTRA
    的頭像 發表于 05-10 15:14 ?603次閱讀

    垃圾中轉站無人值守物聯網解決方案

    收集點的垃圾,進行分類分揀與處理回收,隨后再轉運到焚燒廠、填埋場或回收站等進行最終處理。隨著各種智能裝備的加入,如壓濾設備、污水處理設備、廢氣凈化設備等,為垃圾中轉提供高效率低成本的工
    的頭像 發表于 04-19 11:22 ?751次閱讀
    <b class='flag-5'>垃圾</b>中轉站無人值守物聯網解決方案

    智能垃圾回收箱系統軟件設計

    智能垃圾回收箱自動分揀、智能感知智能垃圾回收箱是物聯網設備,通常支持聯網和與手機應用程序進行交互等功能。這些功能需要可靠的云平臺支持,因此選擇合適的云平臺至關重要。物聯網平臺選擇機智云
    的頭像 發表于 04-19 08:10 ?578次閱讀
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱系統軟件設計

    智能垃圾回收箱控制系統硬件設計

    智能高效遠程控制智能垃圾回收箱控制系統硬件部分的選型與設計是整個產品的基礎,所有功能的實現都要圍繞其進行開發。本章對智能垃圾回收箱控制系統的硬件進行詳細設計。智能
    的頭像 發表于 04-13 08:10 ?928次閱讀
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱控制系統硬件設計

    智能垃圾回收箱及其控制系統

    智能高效遠程控制智能垃圾回收箱本文設計了基于機械傳動、嵌入式系統和物聯網技術的智能垃圾回收箱及控制系統,包括結構、硬件和軟件設計,以及基于機智云后臺服務器的操作系統,實現了用戶信息識
    的頭像 發表于 04-13 08:10 ?1318次閱讀
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱及其控制系統

    基于機智云物聯網平臺的智能垃圾回收箱與控制系統研究

    桶滿時,可取出并運往公司處理。箱體配備四種回收物投放口的控制按鍵,前面有掃碼裝置用于身份確認。中間的顯示屏顯示運行狀態,并實時反饋投放信息給居民。頂部攝像頭監控投放情況,防止盜竊。智能垃圾回收箱的
    發表于 04-09 17:25

    消防員偏愛FLIR K系列熱成像儀的大關鍵原因

    由于消防現場需要選擇簡單可靠的設備,所以FLIR K系列熱像儀只用紅色、橙色和黃色三種顏色顯示溫度信息,這種簡化的三色格式便于消防員快速準確地判斷危險等級,讓消防員準確識別比周圍環境更熱的區域。
    發表于 02-21 17:14 ?409次閱讀
    消防員偏愛FLIR K系列熱成像儀的<b class='flag-5'>三</b>大關鍵原因
    主站蜘蛛池模板: 久久精品久久久久 | 99婷婷久久精品国产一区二区 | 中国老太太xxx | 欧美v1deossexo高清| 亚洲AV久久久噜噜噜久久 | 国产色精品久久人妻无码看片 | 伊人免费在线 | 亚洲免费国产在线日韩 | 无套内射CHINESEHD熟女 | 成人免费精品视频 | 伊人久久大香线蕉无码麻豆 | 男人狂躁进女人免费视频公交 | 国产成人在线免费 | 少妇高潮惨叫久久久久久电影 | 办公室日本肉丝OL在线 | 手机看片国产免费 | 99视频精品全部免费观看 | 亲嘴扒胸摸屁股视频免费网站 | 色网址在线观看 | 天天久久狠狠色综合 | 国内精品蜜汁乔依琳视频 | 色窝窝亚洲AV在线观看 | 日日日操操操 | 国精产品一区一区三区M | 美女图片131亚洲午夜 | 亚州笫一色惰网站 | 扒开老师大腿猛进AAA片软件 | 好看AV中文字幕在线观看 | 久久伦理影院 | 王小军怎么了最新消息 | 67194con免费福和视频 | 野花社区视频WWW高清 | 拍戏被CAO翻了H | 免费99精品国产人妻自在线 | 午夜福利影院私人爽爽 | 99爱在线精品视频网站 | 2021久久精品免费观看 | 蜜桃成熟时2在线 | 国模玲玲自拍337p | 丰满大屁俄罗斯肥女 | 韩国女主播内部vip自带氏巾 |