主頁 > 後端開發 > 深入理解Java虛擬機 -- 經典垃圾收集器

深入理解Java虛擬機 -- 經典垃圾收集器

2021-11-15 08:14:45 後端開發

文章目錄

    • 1. 綜述
    • 2. Serial收集器
    • 3. ParNew收集器
    • 4. Parallel Scavenge收集器
    • 5. Serial Old收集器
    • 6. Parallel Old收集器
    • 7. CMS收集器
    • 8. Garbage First收集器

本文參考于《深入理解Java虛擬機》

1. 綜述

1. 總述

如果說收集演算法是記憶體回收的方法論,那垃圾收集器就是記憶體回收的實踐者,《Java虛擬機規范》中對垃圾收集器應該如何實作并沒有做出任何規定,因此不同的廠商、不同版本的虛擬機所包含的垃圾收集器都可能會有很大差別,不同的虛擬機一般也都會提供各種引數供用戶根據自己的應用特點和要求組合出各個記憶體分代所使用的收集器,

2. 圖示總述

在這里插入圖片描述

上圖展示了七種作用于不同分代的收集器,如果兩個收集器之間存在連線,就說明它們可以搭配使用,圖中收集器所處的區域,則表示它是屬于新生代收集器抑或是老年代收集器

3. 應用中應如何做出選擇?

雖然我們會對各個收集器進行比較,但并非為了挑選一個最好的收集器出來,雖然垃圾收集器的技術在不斷進步,但直到現在還沒有最好的收集器出現,更加不存在“萬能”的收集器,所以我們選擇的只是對具體應用最合適的收集器,這點不需要多加論述就能證明:如果有一種放之四海皆準、任何場景下都適用的完美收集器存在,HotSpot虛擬機完全沒必要實作那么多種不同的收集器了

2. Serial收集器

1. 簡介

Serial收集器是最基礎、歷史最悠久的收集器,曾經(在JDK 1.3.1之前)是HotSpot虛擬機新生代收集器的唯一選擇,大家只看名字就能夠猜到,這個收集器是一個單執行緒作業的收集器,但它的“單執行緒”的意義并不僅僅是說明它只會使用一個處理器或一條收集執行緒去完成垃圾收集作業,更重要的是強調在它進行垃圾收集時,必須暫停其他所有作業執行緒,直到它收集結束(“Stop The World”),

2. 圖解作業程序

在這里插入圖片描述

3.使用的垃圾收集演算法

標記-復制演算法

4. 優點

簡單而高效(與其他收集器的單執行緒相比),對于記憶體資源受限的環境,它是所有收集器里額外記憶體消耗最小的;對于單核處理器或處理器核心數較少的環境來說,Serial收集器由于沒有執行緒互動的開銷,專心做垃圾收集自然可以獲得最高的單執行緒收集效率

5. 缺點

在垃圾回收程序中會觸發 “Stop The World”產生停頓,從而導致用戶體驗不好

6. 主要應用場景

Serial收集器對于運行在客戶端模式下的虛擬機來說是一個很好的選擇,

3. ParNew收集器

1. 簡介

ParNew收集器實質上是Serial收集器的多執行緒并行版本新生代收集器),除了同時使用多條執行緒進行垃圾收集之外,其余的行為包括Serial收集器可用的所有控制引數(例如:-XX:SurvivorRatio、-XX PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集演算法Stop The World物件分配規則回收策略等都與Serial收集器完全一致,在實作上這兩種收集器也共用了相當多的代碼,

2. 圖解作業程序

在這里插入圖片描述

3. 使用的垃圾收集演算法

標記-復制演算法

4. 補充概念

  1. 并行:并行描述的是多條垃圾收集器執行緒之間的關系,說明同一時間多條這樣的執行緒在協同作業,通常默認此時用戶執行緒是處于等待狀態,

  2. 并發:并發描述的是垃圾收集器執行緒與用戶執行緒之間的關系,說明同一時間垃圾收集器執行緒與用戶執行緒都在運行,由于用戶執行緒并未被凍結,所以程式仍然能回應服務請求,但由于垃圾收集器執行緒占用了一部分系統資源,此時應用程式的處理的吞吐量將受到一定影響,

5. 主要應用場景

它是許多運行在 Server 模式下的虛擬機的首要選擇除了 Serial 收集器外,只有它能與 CMS 收集器(真正意義上的并發收集器,后面會介紹到)配合作業,

4. Parallel Scavenge收集器

1. 簡介

Parallel Scavenge收集器也是一款新生代收集器,它同樣是基于標記-復制演算法實作的收集器,也是能夠并行收集的多執行緒收集器,Parallel Scavenge的諸多特性從表面上看和ParNew非常相似,Parallel Scavenge收集器的特點是它的關注點與其他收集器不同,CMS等收集器的關注點是盡可能地縮短垃圾收集時用戶執行緒的停頓時間,而Parallel Scavenge收集器的目標則是達到一個可控制的吞吐量

2. 補充概念

吞吐量就是處理器用于運行用戶代碼的時間與處理器總消耗時間的比值

在這里插入圖片描述

如果虛擬機完成某個任務,用戶代碼加上垃圾收集總共耗費了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%, 停頓時間越短就越適合需要與用戶互動或需要保證服務回應質量的程式,良好的回應速度能提升用戶體驗;而高吞吐量則可以最高效率地利用處理器資源,盡快完成程式的運算任務,主要適合在后臺運算而不需要太多互動的分析任務

3. 圖解作業程序

在這里插入圖片描述

4. 使用的垃圾收集演算法

標記-復制演算法

5. 相關的引數

Parallel Scavenge收集器提供了兩個引數用于精確控制吞吐量,分別是控制最大垃圾收集停頓時間-XX:MaxGCPauseMillis 引數以及直接設定吞吐量大小-XX:GCTimeRatio 引數,

5. Serial Old收集器

1. 簡介

Serial OldSerial收集器的老年代版本,它同樣是一個單執行緒收集器,使用標記-整理演算法

2. 圖解作業程序

在這里插入圖片描述

3. 使用的垃圾收集演算法

標記-整理演算法

4. 主要的應用場景

  1. 供客戶端模式下的HotSpot虛擬機使用
  2. 服務端模式下,一種在JDK 5以及之前的版本與Parallel Scavenge收集器搭配使用;另外一種就是作為CMS收集器發生失敗時的后備預案

6. Parallel Old收集器

1. 簡介

Parallel OldParallel Scavenge收集器的老年代版本支持多執行緒并發收集,基于標記-整理演算法實作,

2. 圖解作業程序

在這里插入圖片描述

3. 使用的垃圾收集演算法

標記-整理演算法

4. 主要的應用場景

注重吞吐量或者處理器資源較為稀缺的場合,都可以優先考慮Parallel Scavenge 加 Parallel Old收集器這個組合,

7. CMS收集器

1. 簡介

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器,CMS收集器是基于標記-清除演算法實作的,它非常適合在注重用戶體驗的應用上使用

2. 作業程序

  1. 初始標記標記一下GC Roots能直接關聯到的物件,速度很快
  2. 并發標記:從GC Roots的直接關聯物件開始遍歷整個物件圖的程序,這個程序耗時較長但是不需要停頓用戶執行緒用戶執行緒可以與垃圾收集執行緒一起并發運行,
  3. 重新標記:為了修正并發標記期間因用戶程式繼續運作而導致標記產生變動的那一部分物件的標記記錄,這個階段的停頓時間通常會比初始標記階段稍長一些,但也遠比并發標記階段的時間短,
  4. 并發清除清理洗掉掉標記階段判斷的已經死亡的物件,由于不需要移動存活物件,所以這個階段也是可以與用戶執行緒同時并發的,

3. 圖解作業程序

在這里插入圖片描述

4. 使用的垃圾收集演算法

標記-清除演算法

5. 優點

  1. 回收停頓時間短,給用戶帶來良好的互動體驗,
  2. 并發收集

6. 缺點

  1. 對處理器資源非常敏感
  2. 無法處理“浮動垃圾”
  3. 因為CMS收集器是一款基于標記-清除演算法的垃圾收集器,其收集結束時會有大量空間碎片產生

7. 主要的應用場景

它非常適合在注重用戶體驗和要求停頓時間短的應用上使用

8. Garbage First收集器

1. 簡介

G1 (Garbage-First) 是一款面向服務器的垃圾收集器,主要針對配備多顆處理器及大容量記憶體的機器,以極高概率滿足 GC 停頓時間要求的同時,還具備高吞吐量性能特征,G1在后臺維護一個優先級串列,每次根據用戶設定允許的收集停頓時間,優先處理回收價值收益最大的那些Region,這種使用 Region劃分記憶體空間以及有優先級的區域回收方式,保證了 G1 收集器在有限時間內可以盡可能高的收集效率(把記憶體化整為零),

2. 作業程序

  1. 初始標記:僅僅只是標記一下GC Roots能直接關聯到的物件,并且修改TAMS指標的值,讓下一階段用戶執行緒并發運行時,能正確地在可用的Region中分配新物件,這個階段需要停頓執行緒,但耗時很短,而且是借用進行Minor GC的時候同步完成的,所以G1收集器在這個階段實際并沒有額外的停頓,
  2. 并發標記:從GC Root開始對堆中物件進行可達性分析,遞回掃描整個堆里的物件圖,找出要回收的物件,這階段耗時較長,但可與用戶程式并發執行,當物件圖掃描完成以后,還要重新處理SATB記錄下的在并發時有參考變動的物件
  3. 最終標記對用戶執行緒做另一個短暫的暫停用于處理并發階段結束后仍遺留下來的最后那少量的SATB記錄
  4. 篩選回收:負責更新Region的統計資料,對各個Region的回收價值和成本進行排序,根據用戶所期望的停頓時間來制定回收計劃,可以自由選擇任意多個Region構成回收集,然后把決定回收的那一部分Region的存活物件復制到空的Region中再清理掉整個舊Region的全部空間,這里的操作涉及存活物件的移動,是必須暫停用戶執行緒,由多條收集器執行緒并行完成的,

從上述階段的描述可以看出,G1收集器除了并發標記外其余階段也是要完全暫停用戶執行緒的,換言之,它并非純粹地追求低延遲,官方給它設定的目標是在延遲可控的情況下獲得盡可能高的吞吐量,所以才能擔當起“全功能收集器”的重任與期望,

3. 圖解作業程序

在這里插入圖片描述

4. 特點

  1. 并行與并發
  2. 分代收集
  3. 空間整合
  4. 可預測的停頓

5. 使用此收集器下的堆記憶體說明

在這里插入圖片描述

G1不再堅持固定大小以及固定數量的分代區域劃分,而是把連續的Java堆劃分為多個大小相等的獨立區域(Region),每一個Region都可以根據需要,扮演新生代的Eden空間、Survivor空間,或者老年代空間收集器能夠對扮演不同角色的Region采用不同的策略去處理,這樣無論是新創建的物件還是已經存活了一段時間、熬過多次收集的舊物件都能獲取很好的收集效果,Region中還有一類特殊的Humongous區域(H)專門用來存盤大物件,G1認為只要大小超過了一個Region容量一半的物件即可判定為大物件,每個Region的大小可以通過引數-XX:G1HeapRegionSize設定,取值范圍為1MB~32MB,且應為2的N次冪,而對于那些超過了整個Region容量的超級大物件將會被存放在N個連續的Humongous Region之中,G1的大多數行為都把Humongous Region作為老年代的一部分來進行看待,如上圖所示,雖然G1仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了,它們都是一系列區域(不需要連續)的動態集合

6. 主要的應用場景

主要使用于服務端模式下的垃圾回收

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357101.html

標籤:java

上一篇:SpringBoot專案實戰雜貨鋪之登錄訪問量可視化條形圖(六)

下一篇:初始Java Java SE 包,繼承,組合,多型,抽象類,介面

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more