JVM 調優 2:GC 如何判斷對象是否為垃圾,三色標記算法應用原理及存在的問題?

文章目錄

  • 前言
  • 一、如何判斷一個對象是否為垃圾?
    • 1.1、reference count(引用計數)
    • 1.2、reference count(引用計數)存在的問題
  • 二、Root Searching(根可達算法或根搜索算法)
    • 2.1、Root Searching 釋義
    • 2.2、根對象(root)的類型
  • 三、三色標記算法原理與存在的問題
    • 3.1、Mark-Sweep(標記清除)
      • 3.1.1、Mark-Sweep(標記清除)應用原理
      • 3.1.2、存在問題-內存碎片化
    • 3.2、Copying(拷貝)
      • 3.2.1、Copying(拷貝)應用原理
      • 3.2.2、存在問題-浪費空間
    • 3.3、Mark-Compact(標記壓縮或標記整理)
      • 3.3.1、Mark-Compact(標記壓縮或標記整理)應用原理
      • 3.3.2、存在的問題-效率過低
  • 四、垃圾回收器的制定原則
    • 4.1、綜合三種算法的 GC
    • 4.2、新生代里面對象的 age 要取值多少?
    • 4.3、堆內存邏輯分區介紹(適用分代垃圾回收器)
    • 4.4、為什么年輕代用 Copying(拷貝)算法?
    • 4.5、 Copying(拷貝)算法在年輕代中的具體應用
  • 總結


前言

本文進入我們進入 JVM 調優系列 2,GC 如何判斷對象是否為垃圾,這個是面試中的高頻面試題,同時對于 GC 的三色標記算法屬于 GC 算法的核心內容,我們將通過算法的應用原理進行深度剖析并分析存在的問題,由此來得出 GC 的制定機制是什么?這里就不再強調重點了,因為到處都是重點!

在這里插入圖片描述


一、如何判斷一個對象是否為垃圾?

1.1、reference count(引用計數)

查看是否有引用指向該對象,有則說明該對象不是垃圾,反之就是垃圾。

我們通過下圖的引用對象案例來說明。

在這里插入圖片描述
如上圖所示,我們可以看到一共是存在四個階段。

  • 第一階段,有 3 個引用指向該對象,那該對象肯定不是垃圾。
  • 第二三階段,部分引用消失,分別各有 2 個和 3 個引用指向該對象,那該對象仍然不是垃圾。
  • 第四階段,沒有任何引用再指向該對象,該對象淪為垃圾。這時垃圾回收器就可以將其回收。

1.2、reference count(引用計數)存在的問題

當出現循環引用時,如下圖所示:

在這里插入圖片描述
我們可以看到,三個對象各自指向循環中的另一個對象,但是沒有其他引用指向這三個對象,那這三個對象就屬于“一堆垃圾”。

那現在我們上面所說的引用計數就不能解決這個該問題,這時我們就需要使用另外一種定位方式——Root Searching(根可達算法或根搜索算法)

二、Root Searching(根可達算法或根搜索算法)

2.1、Root Searching 釋義

所謂的“根”即是:所有的程序都是從 main 方法來運行,在 main 方法里面 new 出來的對象即為根對象。

例如:在 main 方法里面我們 new 了一個 list 集合,在 list 集合中我們又可以存放若干其他對象,那我們就稱 list 為根對象,我們順著根的數據結構往下走,只要存在引用指向的對象,那該對象就不是垃圾,反之不存在引用的對象,那該對象就是垃圾。

在這里插入圖片描述
如上圖所示,對象一、二、三、四、五均是存在根對象的引用,對象五、六之間是我們上面所提到的循環引用,對象八不存在引用,故對象六、七、八是垃圾。

2.2、根對象(root)的類型

根對象不僅僅包括我們上面所說的 main 方法里面的對象,屬于根對象的還有以下這些:

  • JVM stack
  • native method stack
  • runtime constant pool
  • static references in method area
  • Clazz

三、三色標記算法原理與存在的問題

GC Algorithms 到目前為止一共是有三種,我們將一一進行介紹。

  • Mark-Sweep(標記清除)
  • Copying(拷貝)
  • Mark-Compact(標記壓縮或標記整理)

3.1、Mark-Sweep(標記清除)

3.1.1、Mark-Sweep(標記清除)應用原理

在這里插入圖片描述
如上圖所示,我們將可回收的垃圾對象進行標記定位,進行清除即可。將垃圾位變為可用位

3.1.2、存在問題-內存碎片化

算法比較簡單,存在缺點,長時間的運行,內存中會存在大量的碎片(碎片化問題)。

何為碎片化?

由上述得知,每一小塊可回收內存均需要標記后單獨清除,在業務量較大,頻繁更新數據的情況下,會有個別的“碎片”長期存在于內存中不去使用,占用資源空間。大量的碎片就會造成查詢效率極其低下,所以我們就需要進行處理。

3.2、Copying(拷貝)

如果我們不想出現碎片化問題,我們就可以考慮使用 Copying(拷貝)算法。

3.2.1、Copying(拷貝)應用原理

在這里插入圖片描述
如上圖所示,拷貝算法不管內存有多大,直接一分為二,每次使用僅使用內存的一半,在被使用的內存即將用盡時,將可以使用的存活對象拷貝到另一半內存中,將剩下的可回收的垃圾對象進行回收操作。在另一半內存中進行正常操作,如此循環往復

這種算法每次拷貝完成所有的內存空間都是排列在一起,故不會產生碎片化問題。

3.2.2、存在問題-浪費空間

該算法的優勢即是它的劣勢,每次僅可以使用一般的內存空間進行操作,相當于浪費了一半的內存空間。

3.3、Mark-Compact(標記壓縮或標記整理)

Mark-Compact(標記壓縮)的優勢在于完善了上述兩種算法存在的缺點,既不存在碎片化問題,也不浪費空間。

3.3.1、Mark-Compact(標記壓縮或標記整理)應用原理

在這里插入圖片描述
把有用的存活對象壓縮到內存空間的最前面,對可回收的垃圾對象進行處理,如上圖所示。

3.3.2、存在的問題-效率過低

由于每次在壓縮之間都需要計算空間,導致回收的效率大大降低。

四、垃圾回收器的制定原則

上述三種標記算法可謂是各有利弊,因此在實際應用中,一個垃圾回收器的制定是綜合了上述三種算法。

4.1、綜合三種算法的 GC

在這里插入圖片描述
如上圖所示,我們將新誕生的對象存放在新生代里。如果新誕生的對象經歷了數次垃圾回收仍然沒有被回收掉(即每經歷一次垃圾回收,該對象年齡 +1,即 age++),當 age 到達一定數值,將該對象置于老年代中進行特殊處理。

4.2、新生代里面對象的 age 要取值多少?

這個即是我們進行 JVM 調優所需要的自行調整的,根據項目需求來設置
同時對于年齡的設置,與具體所使用的 GC 息息相關

  • 如果之前沒有對 GC 進行調整或調優的話,默認使用的 GC 為使用的是 PS+PO(Parallel Scavenge+Parallel
    Old),默認年齡為 15。
  • 如果進行調整之后所使用的 GC 是 CMS,那 age 就是 6。
  • 如果使用的 GC 是 G1 的話,則就徹底與 age 無關,因為該 GC 不分代。

4.3、堆內存邏輯分區介紹(適用分代垃圾回收器)

在 4.1 圖中,老年代為 tenured。我們將新生代分為三個部分:伊甸園區和兩個 survivor 區。

  • 伊甸園區,即對象誕生的地方,存放所有新生的對象,與在西方中我們人類誕生的地方——伊甸園想對應。
  • survivor 區,幸存者區,存放沒有在垃圾回收中被回收的對象,有兩個,通常命名為 s0、s1 或者 s1、s2 等叫法。

我們一般在年輕代中使用的 GC 算法為 Copying(拷貝),老年代中使用的 GC 算法為 Mark-Sweep(標記清除)和 Mark-Compact(標記壓縮或標記整理)。

4.4、為什么年輕代用 Copying(拷貝)算法?

首先我們先考慮 Mark-Sweep(標記清除)和 Mark-Compact(標記壓縮或標記整理),上面我們已經說到,這兩種 GC 算法的缺點分別是:產生碎片化問題、內存回收效率低

程序產生對象后,該對象很可能會在很短的時間內被回收,根據統計,一次垃圾回收可以回收掉 90% 的對象。在這樣的情況下,使用 Mark-Sweep(標記清除)和 Mark-Compact(標記壓縮或標記整理)效率就太低了,會造成伊甸園區很快爆滿或者大規模碎片化,而新產生的對象產生放進去的效率就會大大降低。

所以在 JVM 設計中,要求年輕代的算法效率是特別高、特別快的。而 Copying(拷貝)算法的效率是最高的,但是浪費了年輕代中至少一半的內存空間。

那我們既要利用好 Copying(拷貝)算法效率高的優勢,又要盡量避免內存浪費的問題,怎么解決?

4.5、 Copying(拷貝)算法在年輕代中的具體應用

第一次垃圾回收:首先將 10% 的幸存對象拷貝到第一個 survivor 中,即 s0 中,然后將整個伊甸園區進行清除。這時所有有用對象都存放在 s0 中。如下圖所示:

在這里插入圖片描述
第二次垃圾回收:將伊甸園區中有用的對象拷貝到另一個 survivor 中,即 s1 中,再將之前 s0 中的對象(前提是有用)拷貝到 s1 中,對伊甸園區與第一個 s0 進行垃圾回收。這時所有有用的對象存放在 s1 中。如下圖所示:

在這里插入圖片描述
第三次垃圾回收:再次利用 s0,將之前存活的對象與伊甸園區中產生的新對象存放在 s0 中,對伊甸園區與 s1 進行二垃圾回收。如下圖所示:

在這里插入圖片描述
第 n 次垃圾回收:如此循環往復利用新生代中的伊甸園區與 survivor 區即可。


總結

在本文中我們通過引用計數和根可達兩種算法來判斷一個對象是否為垃圾,引出在 GC 中的核心——三色標記算法,對于三色標記算法的核心和流程進行了深度剖析,以及其所存在的問題。三色標記算法又為我們引出 GC 的制定原則,GC 對于拷貝算法如何在新生代中運用以提高 JVM 的效率,都是重點內容,這里就不過分強調了。

在這里插入圖片描述


我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530644.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

班尼機器人怎么拆_博鼎建筑科技外墻錯臺打磨機器人和外墻螺桿洞封堵機器人—自升造樓平臺1+N執行器...

繼上期的混凝土整平機和智能噴淋養護系統,本期給大家介紹的是實際應用在自升造樓平臺外墻環軌車上的外墻錯臺打磨機器人和外墻螺桿洞封堵機器人。外墻錯臺打磨機器人傳統外墻錯臺處理,需要人工拿鑿具對外墻面錯臺進行鑿平處理。鑿具重、操作人工容易疲勞…

架構師基礎必備:“腹有詩書氣自華”,馳騁一線大廠不是夢,抓緊收藏

文章目錄前言一、軟件1.1、何為軟件?1.2、計算機軟件的分類1.2.1、系統軟件1.2.2、應用軟件1.3、軟件系統體系結構1.3.1、C/S 結構(桌面應用程序)1.3.2、B/S 結構(Web 應用程序)1.3.3、Web 服務器與數據庫服務器1.3.4、…

JDK 7-JDK 21:Oracle Java SE 支持路線圖/Oracle Java SE Support Roadmap 持續更新

文章目錄前言一、Oracle Java SE 產品版本二、Java SE 8 的公共更新結束三、參考文檔總結前言 幾十年來,Java 生態系統已經成功地經歷了這個過程,經歷了十次主要的平臺修訂。長期強大的向后兼容性保護了整個生態系統的投資。同時,隨著時間的推…

multisim中輕觸開關在哪_現貨供應輕觸開關|品質確保|廠家直銷

輕觸開關是現今社會生活當中不可或缺的電子元器件之一,那么大家在使用的過程當中是否注意到一些細節問題。首先,我們要注意產品的放置要盡量避免接觸腐蝕性氣體以及過于潮濕的環境,這樣很容易造成產品的損壞,減少輕觸開關的使用壽…

DDoS 攻擊與防護(一):如何識別 DDoS 攻擊?DDoS 防護 ADS 服務有哪些?

文章目錄前言一、什么是 DDoS 防護 ADS?1.1、什么是 DDoS 攻擊?1.2、如何識別 DDoS 攻擊?1.3、從 Web 訪問流程分析 DDoS 攻擊1.4、DDoS 攻擊類型二、DDoS 防護 ADS 介紹2.1、Anti-DDoS 流量清洗2.2、DDoS 原生高級防護2.3、DDoS 高防三、DDo…

收藏功能_六款多功能榻榻米,裝完你家會大一半!超實用,收藏

原標題:六款多功能榻榻米,裝完你家會大一半!超實用,收藏當今社會城市的生活壓力大,在外日夜打拼,回到家中只想做一個慵懶派,隨性舒適的榻榻米,功能樣式豐富,能讓你徹底釋…

混凝土墻開洞_新樂專業混凝土切割報價適中

新樂專業混凝土切割報價適中粘碳纖維加固,屋頂加層。本公司采用目前的鋼筋混凝土切割結構分離和水鉆排孔技術。真正實現對不同規格和形狀的橋梁、道路、煙囪、建筑立柱、鋼筋砼墻體、磚混結構墻體、建筑大梁等建筑物、構筑物實施無損切割(傳統的建筑改造或局部拆除分…

class觸發后讓另一個class加樣式_Bootstrap的按鈕組樣式

將一系列的.btn包裹在.btn-group內&#xff0c;并使用我們提供的插件&#xff0c;可以實現選擇按鈕、選取塊狀區的行為功能。<div class"row mt-5 d-block"><div class"btn-group"><button class"btn btn-primary">Left</b…

碼云怎么創建公開的倉庫_使用碼云或GitHub搭建簡單的個人網站(補充hexo搭建博客)...

使用碼云或GitHub搭建個人網站碼云&#xff1a;1、新建一個倉庫路徑名會影響你的個人網站的網址(自行修改)&#xff0c;開源(公開)&#xff0c;其他默認我們點擊創建2、進入倉庫后&#xff0c;我們新建一個文件3、文件名為index.html&#xff0c;再寫入我們的html代碼然后“提交…

bsp模型適用于圖計算_【論文解讀】目標檢測之RFBnet模型

原創聲明&#xff1a;本文為 SIGAI 原創文章&#xff0c;僅供個人學習使用&#xff0c;未經允許&#xff0c;不能用于商業目的。其它機器學習、深度學習算法的全面系統講解可以閱讀《機器學習-原理、算法與應用》&#xff0c;清華大學出版社&#xff0c;雷明著&#xff0c;由SI…

win10雷電3接口驅動_“雷電3”接口知識大科普

近年來部分高端筆記本電腦在接口上會采用一種叫“雷電3”的新接口。今天小編就為大家解讀一下“雷電3”接口的特性。最早的雷電接口雷電接口是由Intel開發定制的、接口類型為mini DP&#xff0c;在雷電3接口出來之前&#xff0c;雷電1和雷電2都是作為在蘋果MAC上使用的&#xf…

springboot怎么返回404_深度分析:SpringBoot異常捕獲與封裝處理,看完你學會了嗎?...

簡介日常開發過程中&#xff0c;難免有的程序會因為某些原因拋出異常&#xff0c;而這些異常一般都是利用try &#xff0c;catch的方式處理異常或者throw&#xff0c;throws的方式拋出異常不管。這種方法對于程序員來說處理也比較麻煩&#xff0c;對客戶來說也不太友好&#xf…

新生成長記;關于zzulioj1056,幸運數字

剛剛接觸代碼的我&#xff0c;對計算機愈來愈好奇&#xff0c;開學的兩個月&#xff0c;幾乎沒看書只顧著做題&#xff0c;當然&#xff0c;不會就百度&#xff0c;或者看大佬的博客&#xff0c;這些都是好東西&#xff0c;實在看不懂的&#xff0c;就拿著跑去問學長&#xff0…

獲取form表單_【第1535期】前端 Form 的表單的一個通用解決方案

前言今日早讀文章由阿里布達投稿分享。布達&#xff0c;Alibaba Fusion項目組的。花名潕量。主要專注在設計系統、組件、可視化搭建這個領域正文從這開始&#xff5e;&#xff5e;Fusion Next - Form 表單解決方案前端的Form 表單主要用于解決數據獲取、數據校驗、數據賦值 這三…

c語言表白用代碼(1)

不多說&#xff0c;直接上代碼&#xff0c;有用拿走&#xff0c;侵權立刪。 希望大家盡早找到自己的另一半。 #include <stdio.h> #include <math.h> #include <stdlib.h> #define I 20 #define R 340 #include <string.h> int main() {char answer[4…

react取消捕獲_React學習筆記(三)

React學習筆記&#xff08;三&#xff09;&#xff0c;組件的生命周期React中組件也有生命周期&#xff0c;也就是說也有很多鉤子函數供我們使用, 組件的生命周期&#xff0c;我們會分為四個階段&#xff0c;初始化、運行中、銷毀、錯誤處理(16.3之后)初始化在組件初始化階段會…

zzulioj1111: 多個整數的逆序輸出(函數專題)

1111: 多個整數的逆序輸出&#xff08;函數專題&#xff09;時間限制: 1 Sec 內存限制: 128 MB 提交: 3521 解決: 2617 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入n和n個整數&#xff0c;以與輸入順序相反的順序輸出這n個整數。要求不使用數組&#xff0c;而使用遞歸…

快捷鍵_AutoCAD 2021中的默認快捷鍵、新建或編輯快捷鍵

文&#xff1a;CAD鐘日銘。歡迎關注和點贊支持。在使用AutoCAD進行制圖的過程中&#xff0c;掌握一些快捷鍵會提高操作效率。所謂的快捷鍵是指用于啟動命令的鍵組合。例如&#xff0c;按CtrlN組合鍵(快捷鍵)新建圖形文件&#xff0c;按 CtrlO組合鍵可打開圖形文件&#xff0c;按…

1112: 進制轉換(函數專題)

1112: 進制轉換&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 3448 解決: 2599 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入一個十進制整數n&#xff0c;輸出對應的二進制整數。常用的轉換方法為“除2取余&#xff0c;倒序排列”。將一個…

出現畫面抖動_連續抖動20小時!虎門大橋橋面如波浪翻滾,專家:個人感覺沒問題...

前兩天(5月5日)&#xff0c;虎門大橋橋面出現如波浪翻滾的起伏&#xff0c;引發廣泛的關注&#xff1a;次日&#xff0c;廣東交通集團通報&#xff0c;虎門大橋震動是渦振現象&#xff0c;懸索橋結構安全。專家初步判斷此次渦振和橋上設置水馬有關。但直到6日早上11時&#xff…