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

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

3天內不再提示

ZGC的垃圾回收流程

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-11 15:37 ? 次閱讀

Java長期支持版本Java11發布時推出了ZGC, 之后的Java12 -16均有ZGC的一些更新。然而Java17的新特性已經敲定,確定沒有關于ZGC的相關更新,也從另一方面說明了至Java17 ZGC已經比較穩定,可以作為比較穩定的GC垃圾回收器。相信未來ZGC必定會成為主流的Java垃圾回收期,那么盤一盤ZGC就是必然的了。

1 ZGC從何而來,有什么好處

1.1 ZGC 的命名

根據OpenJDK官方網站的說明ZGC其實并沒有什么特殊意義,就是一個名字而已。起初只是為了致敬ZFS 文件系統,表示ZGC與ZFS一樣都是革命性的,是一個跨時代的產品。更像是一種崇拜命名法。所以ZGC就是要做革命性的與以往的垃圾回收器性能上有很大提高的GC。

1.2ZGC的好處及特點

ZGC是一個低延遲的可擴展GC,它有以下的目標

  1. 亞毫秒級別的時間延遲 (就是不超過1毫秒。)

    下圖是SPEC做出的測試對比,Java16中ZGC 已經可做到亞毫秒級別的延遲了

圖片

2. 暫停時間不會隨著堆的大小、存活集、根集的大小的增加而增加
3. 支持8MB-16TB級別的堆大小

同時ZGC有如下標簽

  • 并發
  • 基于Region
  • 堆壓縮
  • 彩色指針 (對象使用64的指針,有44位表示對象內存地址(如果是8TB , 4TB堆內存則會用到43,42位) ,其中有4位用于GC, 其余為備用 ),個別詳情請看 http://hg.openjdk.java.net/jdk/jdk/rev/24f6b0e413a0

圖片

  • 負載屏障
  • NUMA支持 (每個CPU單獨訪問一塊內存)

2 ZGC如何使用及調優

2.1 ZGC支持那些系統

圖片

直至Java17 ZGC基本支持所有的主流系統。

2.2 ZGC可用的調優參數

盡管ZGC有比較大的改動,但是它仍然可以使用絕大部分的GC參數。當然它也有其特有的參數。

2.2.1 ZGC 通用的參數

-XX:MinHeapSize, -Xms 最小堆大小 (default = 8388608 = 8M)

-XX:InitialHeapSize, -Xms 初始化堆大小 (default = 134217728 = 128M )

-XX:MaxHeapSize, -Xmx 最大堆大小 (default = 2134900736 = 2036M)

-XX:SoftMaxHeapSize JVM堆的最大軟限制 (default = 2134900736 = 2036M)

-XX:ConcGCThreads 并發GC的線程數量(default -XX:+ConcGCThreads=1 )

-XX:ParallelGCThreads 設置垃圾回收時的并行GC線程數量 (default = 4 )

-XX:UseLargePages 使用大頁面內存 (dafault false)

-XX:UseTransparentHugePages 使用Transparent大頁面內存

-XX:UseNUMA 使用UNMA內存分配,可以獲得更好的性能

-XX:SoftRefLRUPolicyMSPerMB 每MB的空閑內存空間允許軟引用對象存活時間(default = 1000)

-XX:AllocateHeapAt = 堆分配參數,可以使用非DRAM 內存,這個參數將指向文件系統的文件并使用內存映射來達到在備用存儲設備上進行堆分配。

2.2.2 ZGC 特有的參數

-XX:ZAllocationSpikeTolerance 修正系數,數值越大,越早觸發GC (default = 2.000000)

-XX:ZCollectionInterval ZGC發生的最小時間間隔 ,秒 (default = 0.000000)

-XX:ZFragmentationLimit relocation時,當前region碎片化大于此值,則回收region (default = 25.000000) -XX:ZMarkStackSpaceLimit 指定為標記堆棧分配的最大字節數 (default = 8589934592 = 8096M)

-XX:ZProactive 是否啟用主動回收 (default true)

-XX:ZUncommit 是否歸還不使用的內存給OS(default true)

-XX:ZUncommitDelay 不再使用的內存最多延遲多久會歸還給OS (default = 300 s)

2.2.3 ZGC的一些診斷參數

-XX:+UnlockDiagnosticVMOptions 使用診斷模式,下面的參數才會起作用

-XX:ZStatisticsInterval 指定統計數據輸出之間的時間間隔(秒)。

-XX:ZVerifyForwarding 檢驗轉發表 -XX:ZVerifyMarking 檢驗標記集

-XX:ZVerifyObjects 檢驗對象 -XX:ZVerifyRoots 檢驗根節點

-XX:ZVerifyViews 檢驗堆視圖訪問

2.3 啟用ZGC

-XX:+UseZGC 啟用ZGC

-XX:+UseZGC -Xmx-Xlog:gc

-XX:+UseZGC -Xmx-Xlog:gc* 可以打印更詳細的GC日志

2.4 可優化參數詳解

2.4.1 堆參數的設置

ZGC比較重要的調優參數是設置最大堆內存(-Xmx)., ZGC設置一個最大堆內存有兩個考量:1.堆可以容納程序的存活集 2.堆中要有足夠的空間允許GC運行時分配.

然而多大內存合適這就要根據 內存使用情況以及GC頻率來確定。

2.4.2 并發GC線程數設置

另一個調優參數就是并發GC線程數量的設置 (-XX:ConcGCThreads=) 。

一般情況下ZGC可以自動選擇一個合適的值,但是也要根據程序的特點來修改。這個參數對GC使用CPU的時間影響比較大,如果數量太大的話,GC線程會占用過多的CPU時間,數量過少的話垃圾回收有會不及時。通常情況下如果程序的低延遲很重要,那么CPU使用率最好永遠不要超過70%。

2.4.3 將不用的內存返回給OS

默認情況下,ZGC會將不使用的內存還給OS??梢允褂肵X:-ZUncommit 取消這一功能。然而如果實際堆內存比最小堆內存都小的話,肯定不會將不使用的內存返還給OS,另外最大堆內存(-Xmx)和最小堆內存 (-Xms) 的設置相等的話,也不會起作用。

另外可以設置延遲歸還對內存的時間 -XX:ZUncommitDelay=

2.4.4 在Linux中開啟大頁支持

在Linux操作系統中,采用內存映射來管理內存,邏輯頁面映射到對應的物理內存,

使用大頁面這個參數在吞吐量,低延遲,啟動時間方面都有很好的性能提升,可以說除了設置起來有點復雜之外,沒有任何的缺點。設置這個參數需要Root權限,所以默認沒有開啟。

2.4.5 Linux中使用大透明頁

Linux下的大頁分為兩種標準,大頁(Huge Pages)和透明大頁(Transparent Huge Pages)。大頁是預分配的方式管理,透明大頁是動態分配的方式。我們可以使用這個參數-XX:+UseTransparentHugePages 來使用 transparent huge pages .對延遲要求很高的程序而言,這個參數是不推薦使用的,它可能會造成不必要的延遲峰值。

2.4.6 配置NUMA的支持

NUMA(非一致性內存訪問)是Intel為了解決SMP多CPU結構中中線訪問方式中資源競爭和一致性問題引起的。ZGC支持NUMA,此特性是默認開啟的,它可以自主判斷系統是否支持NUMA。如果在支持NUMA的機器上運行,那么將有顯著的性能提升。

3 ZGC垃圾回收流程簡述

3.1 ZGC同G1類似,也將內存分為Regions, 叫做ZPages。ZPages可以動態的創建和銷毀,而且還可以動態的變化大小,無論怎么變化均為2MB 的倍數。

ZGC的堆區可以分為Small(2MB) Medium(32MB) Large(N*2MB)等多個Heap Regions. 其中Medium和Large是連續分配的內存。

ZGC的垃圾回收一般可以分為已下幾個步驟流程。

  1. Pause Mark Start
    這個階段會有 STW ,主要對Root集進行掃描,標記Root集中存活對象,即標記根可達對象。
  2. Concurrent Mark/Remap
    并發標記階段,根據上一步標記的根對象去遍歷對象圖,并標記存活對象,主要根據上一步的Root存活對象標記其對象樹上的對象。
  3. Pause Mark End
    標記結束,此處有 STW ,算再標記階段,由于之前標記的時候程序也在運行,此時會有對象引用的變更,此處會對那些變更引用的對象重新標記一下。此時也會清理一些Root對象以及無效空間。
  4. Concurrent Prepare for Relocate
    并發標記Region及處理弱根對象 ,標記需要整理的Region集合,并選擇下一步Relocation要用到的Region集合,也會處理不是強根的對象。
  5. Pause Relocate Start
    開始Relocate,此處有 STW ,處理Root對象的指針,此時會將Roots的對象移動到選好的Region集合中。
  6. Concurrent Relocate
    并發Relocate,此時并發執行,將存活對象移動到上一步選好的新的Region集合中。然后就是清理被釋放的分區,等等工作。

可以看出來ZGC整體使用了標記復制加整理的思想,不過ZGC可以根據當前的內存使用情況,選擇將存活對象整理到一個全新的空Region集合中或者某個存有對象的Region中。由于整個GC的流程中只有三處需要暫停,然而這三處的STW時間都是亞毫秒級別。整個GC的流程延遲總體會小于1ms。

圖片

總結

本片總體概括了介紹了比較成熟的ZGC,介紹了ZGC的一些重要調優參數,講解了一下ZGC的垃圾回收流程。相信各位看官也有所收獲。目前ZGC的應用比較少,但隨著Java17的正式推出,那么ZGC必然會逐漸成為主流GC。

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

    關注

    19

    文章

    2908

    瀏覽量

    103134
  • 參數
    +關注

    關注

    11

    文章

    1403

    瀏覽量

    31569
  • 文件系統
    +關注

    關注

    0

    文章

    272

    瀏覽量

    19725
收藏 人收藏

    評論

    相關推薦

    電子垃圾回收隱患:非法回收1噸獲利萬元

    廣州市政協提交的一份調研報告顯示,非法回收作坊每處置1噸電子垃圾可獲利3000~10000元,報告建議,應通過“誰生產,誰承擔回收處理費”等方式規范管理電子垃圾。
    發表于 07-07 11:37 ?2089次閱讀

    固態硬盤垃圾回收方法

    由于NAND閃存的固有限制,寫前擦除和擦除粒度較大,基于NAND Flash的固態硬盤(SSD)需要執行垃圾回收以重用失效頁。然而垃圾回收帶來的高開銷會顯著降低SSD的性能,也會直接影
    發表于 12-03 10:50 ?2次下載
    固態硬盤<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>方法

    Jvm垃圾回收機制及性能調優實戰

    JVM中自動檢測并移除不再使用的數據對象的這種機制稱為:垃圾回收,簡稱GC。JVM通過使用垃圾收集器及使用相應的垃圾回收算法將內存中不再被使
    發表于 04-03 14:31 ?2次下載

    交大發布可回收垃圾分揀機器人,實現助力全國垃圾分類回收工作

    6月4日消息,交大中英國際低碳學院可回收垃圾分揀機器人,更是打破國外技術壟斷,可實現每小時分揀垃圾5400次,并在大量垃圾中精準識別可回收
    的頭像 發表于 06-04 14:31 ?2784次閱讀

    智能垃圾回收機器人的應用優勢是什么

    為什么需要垃圾回收機器人? 首先,垃圾分類回收是實現地球資源循環利用至關重要的一環,對于可持續發展有重大意義。垃圾分類也是對付
    發表于 07-22 09:26 ?1823次閱讀

    智能垃圾回收機器人的優勢是什么

    為什么需要垃圾回收機器人? 首先,垃圾分類回收是實現地球資源循環利用至關重要的一環,對于可持續發展有重大意義。垃圾分類也是對付
    發表于 07-28 14:42 ?3642次閱讀

    智能垃圾回收機器人的應用優勢有哪些

    為什么需要垃圾回收機器人? 首先,垃圾分類回收是實現地球資源循環利用至關重要的一環,對于可持續發展有重大意義。垃圾分類也是對付
    發表于 08-17 16:08 ?3999次閱讀

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

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

    生活垃圾數據化分類回收方法及其回收系統(機械部分)

    一種生活垃圾數據化分類回收方法及其回收系統(機械部分)(1).doc 上傳完成 刪除 標題一種生活垃圾數據化分類回收方法及其
    發表于 11-05 18:18 ?0次下載

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

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

    JVM入門之垃圾回收算法

    根據如何判定對象是垃圾,垃圾回收算法分為兩類:1、 「引用計數式垃圾收集」 (判定垃圾是通過引用計數器)別名:直接
    的頭像 發表于 02-10 11:40 ?572次閱讀
    JVM入門之<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法

    一文詳解ZGC關鍵技術

    ZGC是如何設計怎么達到這個目標的呢?本文將從ZGC算法的關鍵特性入手,通過分析ZGC周期處理過程來理解這些特性,探索ZGC設計思想。
    發表于 10-23 18:26 ?378次閱讀
    一文詳解<b class='flag-5'>ZGC</b>關鍵技術

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

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

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

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

    智能垃圾回收箱功能實驗

    需要系統地介紹智能垃圾回收箱軟件硬件設計完成后的設備運行狀況,包括正常工作和問題調試。同時,也要描述當所有設備正常工作時智能垃圾回收箱的操作流程
    的頭像 發表于 05-24 08:10 ?98次閱讀
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱功能實驗
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>