JVM虛擬機篇(七):JVM垃圾回收器全面解析與G1深度探秘及四種引用詳解

JVM垃圾回收器全面解析與G1深度探秘及四種引用詳解

  • JVM虛擬機(七):JVM垃圾回收器全面解析與G1深度探秘及四種引用詳解
    • 一、JVM有哪些垃圾回收器
      • 1. Serial回收器
      • 2. ParNew回收器
      • 3. Parallel Scavenge回收器
      • 4. Serial Old回收器
      • 5. Parallel Old回收器
      • 6. CMS(Concurrent Mark Sweep)回收器
      • 7. G1(Garbage-First)回收器
    • 二、詳細聊一下G1垃圾回收器
      • 3.6.1 概述
      • 3.6.2 Young Collection(年輕代垃圾回收)
      • 3.6.3 Young Collection + Concurrent Mark(年輕代垃圾回收 + 并發標記)
      • 3.6.4 Mixed Collection(混合垃圾回收)
    • 三、強引用、軟引用、弱引用、虛引用的區別
      • 3.7.1 強引用(Strong Reference)
      • 3.7.2 軟引用(Soft Reference)
      • 3.7.3 弱引用(Weak Reference)
      • 3.7.4 虛引用(Phantom Reference)

JVM虛擬機(七):JVM垃圾回收器全面解析與G1深度探秘及四種引用詳解

一、JVM有哪些垃圾回收器

在Java虛擬機(JVM)中,垃圾回收器負責自動管理內存,回收不再使用的對象所占用的內存空間。不同的垃圾回收器具有不同的特點和適用場景,以下是常見的JVM垃圾回收器:

1. Serial回收器

  • 特點:單線程垃圾回收器,在進行垃圾回收時,會暫停所有用戶線程(Stop-The-World,STW)。它簡單高效,對于單線程環境或小型應用程序有較好的性能表現。
  • 適用場景:Client模式下的小型應用,對內存要求不高,單核CPU環境。

2. ParNew回收器

  • 特點:Serial回收器的多線程版本,允許多個線程同時進行垃圾回收,同樣會產生STW。它常與CMS回收器配合使用,是Server模式下新生代回收的常用選擇之一。
  • 適用場景:Server模式,多核CPU環境,與CMS配合時的新生代回收。

3. Parallel Scavenge回收器

  • 特點:關注吞吐量的垃圾回收器,通過最大化吞吐量來提高程序的運行效率。它也是多線程回收器,可通過參數控制吞吐量目標。
  • 適用場景:后臺任務、對響應時間要求不高但重視吞吐量的應用,如批量數據處理。

4. Serial Old回收器

  • 特點:Serial回收器的老年代版本,單線程回收,使用標記-整理算法。通常作為其他回收器的后備方案,在JVM內存較小、單核環境下仍有一定應用。
  • 適用場景:與Serial回收器配合,或作為Parallel Scavenge老年代回收的后備。

5. Parallel Old回收器

  • 特點:Parallel Scavenge的老年代版本,多線程,采用標記-整理算法,提供與Parallel Scavenge類似的吞吐量優先特性。
  • 適用場景:注重吞吐量的應用,老年代回收,與Parallel Scavenge配合。

6. CMS(Concurrent Mark Sweep)回收器

  • 特點:以獲取最短回收停頓時間為目標的回收器,采用標記-清除算法。它能在垃圾回收時與用戶線程并發執行部分操作,減少STW時間。
  • 優點:響應速度快,適合對響應時間要求高的應用,如Web應用。
  • 缺點:會產生內存碎片,并發階段可能因用戶線程繼續運行導致重新標記,且對CPU資源敏感。
  • 適用場景:B/S架構等對響應時間敏感的應用。

7. G1(Garbage-First)回收器

  • 特點:新一代垃圾回收器,將堆內存劃分為多個大小相等的Region,采用分代收集思想,但不再有固定的新生代和老年代。它能更精確地控制垃圾回收的停頓時間,同時兼顧吞吐量和響應時間。
  • 適用場景:大內存、多處理器環境,對停頓時間有嚴格要求的應用,是JDK 9及以上的默認回收器。

二、詳細聊一下G1垃圾回收器

3.6.1 概述

G1(Garbage-First)回收器是一種面向服務器的垃圾回收器,旨在滿足高吞吐量和低停頓時間的需求。與傳統回收器不同,G1將堆內存劃分為大量大小相等的Region(區域),每個Region可以動態地扮演新生代或老年代的角色。G1通過維護一個優先列表,每次根據允許的停頓時間優先回收垃圾最多的Region,這也是其名稱“Garbage-First”的由來。這種設計使得G1能更靈活地控制垃圾回收的停頓時間,同時提高內存的利用率和回收效率。

3.6.2 Young Collection(年輕代垃圾回收)

  • 回收過程:當新生代的Eden區填滿時,觸發Young Collection。G1采用復制算法,將Eden區和Survivor區中存活的對象復制到另一個空的Survivor區或晉升到老年代(如果對象年齡達到閾值)。此時會產生STW,但由于新生代對象存活率通常較低,復制操作的開銷相對較小。
  • 特點:快速處理新生代大量短生命周期的對象,通過多線程并行執行,減少回收時間。

3.6.3 Young Collection + Concurrent Mark(年輕代垃圾回收 + 并發標記)

  • 并發標記階段
    • 初始標記(Initial Mark):STW,標記GC Roots直接引用的對象,時間很短。
    • 并發標記(Concurrent Mark):與用戶線程并發執行,從GC Roots開始遍歷對象圖,標記存活的對象。
    • 最終標記(Final Mark):STW,處理并發標記階段遺留的少量對象,確保標記準確。
    • 篩選回收(Live Data Counting and Evacuation):計算每個Region的存活對象和可回收空間,為混合回收做準備。
  • 與Young Collection的配合:在年輕代回收后,通過并發標記確定老年代中哪些Region含有較多垃圾,為后續的混合回收提供依據。

3.6.4 Mixed Collection(混合垃圾回收)

  • 回收過程:G1根據篩選回收階段的統計信息,選擇垃圾比例較高的老年代Region,結合新生代Region一起回收。回收時采用復制算法,將存活對象復制到空的Region中,從而清理掉垃圾較多的Region。
  • 特點:在控制停頓時間的前提下,逐步回收老年代的垃圾,避免老年代內存碎片化,同時提高整體內存的利用率。

三、強引用、軟引用、弱引用、虛引用的區別

3.7.1 強引用(Strong Reference)

  • 定義:程序中最常見的引用方式,如Object obj = new Object();,obj就是一個強引用。
  • 回收時機:只要強引用存在,垃圾回收器永遠不會回收被引用的對象。即使內存不足,JVM也會拋出OutOfMemoryError而不會回收強引用對象。
  • 應用場景:大多數普通對象的引用,確保對象在需要時始終存在。

3.7.2 軟引用(Soft Reference)

  • 定義:通過SoftReference類實現,如SoftReference<Object> softRef = new SoftReference<>(new Object());
  • 回收時機:當內存不足時,垃圾回收器會回收軟引用所引用的對象。軟引用通常用于實現緩存,在內存充足時保留對象,內存緊張時釋放以避免OOM。
  • 應用場景:圖片緩存、網頁緩存等,允許在內存不足時釋放非關鍵對象。

3.7.3 弱引用(Weak Reference)

  • 定義:通過WeakReference類實現,WeakReference<Object> weakRef = new WeakReference<>(new Object());
  • 回收時機:只要發生垃圾回收,無論內存是否充足,弱引用所引用的對象都會被回收。弱引用的生命周期更短。
  • 應用場景:臨時對象、對生命周期要求較短的輔助對象,如哈希表中的弱引用鍵值對,避免內存泄漏。

3.7.4 虛引用(Phantom Reference)

在這里插入圖片描述

  • 定義:通過PhantomReference類實現,且必須配合ReferenceQueue使用,PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);在這里插入圖片描述

  • 回收時機:虛引用隨時可能被垃圾回收器回收,它主要用于跟蹤對象的垃圾回收狀態,而不是實際引用對象。

  • 應用場景:對象回收后的資源釋放等特殊場景,如直接內存的釋放跟蹤。

通過對JVM垃圾回收器的全面了解,尤其是G1回收器的深入剖析,以及四種引用類型的詳細對比,開發者能更好地理解Java內存管理機制,優化程序性能,避免內存相關的問題,編寫出更高效、穩定的Java應用程序。

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

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

相關文章

革新電銷流程,數企云外呼開啟便捷 “直通車”

在當今競爭激烈的商業環境中&#xff0c;電銷作為一種重要的營銷手段&#xff0c;依舊在企業的客戶拓展與業務增長中扮演著關鍵角色。然而&#xff0c;傳統電銷流程常常面臨諸多困擾&#xff0c;像是封卡封號風險、接通率不理想、客戶開發與管理艱難以及銷售考核復雜等問題&…

適合工程建筑行業的OA系統有什么推薦?

工程行業具有項目周期長、協作鏈條復雜等特性&#xff0c;傳統管理模式下的 “人治”“紙質化” 弊端日益凸顯。OA 系統作為數字化管理的核心載體&#xff0c;通過流程標準化、數據可視化&#xff0c;精準解決工程行業項目管理核心痛點。 泛微 e-office 深度聚焦工程場景&#…

車載刷寫架構 --- ECU收到相同的blockSequenceCounter數據包的思考

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

C++ RAII 的用途及業務代碼實現案例

C RAII 的用途及業務代碼實現案例 RAII 的核心概念 RAII (Resource Acquisition Is Initialization&#xff0c;資源獲取即初始化) 是 C 的核心編程范式&#xff0c;其核心思想是&#xff1a; 資源獲取與對象構造綁定資源釋放與對象析構綁定利用 C 對象生命周期自動管理資源…

黑馬 SpringAI+DeepSeek 實戰:從對話機器人到企業級知識庫的大模型開發全攻略

附完整代碼 項目案例&#xff0c;3 天吃透大模型應用開發核心技術 需要完整項目學習視頻以及源碼的私信博主&#xff0c;謝謝~大家一起加油吶&#xff01;&#xff01; 01.認識AI和大模型 小結 AI的發展過程 符號主義 機器學習 深度學習——自然語言處理&#xff08;NLP…

共工新聞社與韓國新華報社達成合作

在當下媒體融合浪潮奔涌的時代背景下&#xff0c;大灣區經濟網戰略媒體香港共工新聞社與韓國新華報社順利簽署合作協議&#xff0c;攜手為傳播全球化進程以及海外華文媒體從單一媒體向多媒體的內涵拓展&#xff0c;乃至區域經濟協同與文化融合發展貢獻力量。 締結友好華文媒體協…

嵌入式Linux驅動——3 總線設備驅動模型

目錄 1.總線設備驅動模型 1.1 總線設備驅動模型 1.2 設備樹 1.3 platform_device 和 platform_driver 的匹配規則 1.3.1 最先比較 1.3.2 然后比較 1.3.3 最后比較 2.LED 模板驅動程序的改造&#xff1a;總線設備驅動模型 1.總線設備驅動模型 在前面的 led 驅動程序中…

操作系統常用命令

邏輯卷創建及掛載步驟&#xff1a; vgcreate vg_app /dev/sda //在sda盤上創建vg_app卷組 lvcreate -L 50G -n lv_mysql vg_app //在vg_app卷組上創建邏輯卷lv_mysql mkfs.xfs /dev/vg_app/lv_mysql //對lv_mysql 邏輯卷創建文件系統 mkdir mysql //創建mysql目錄 ech…

Git 的進階功能和技巧

1、分支的概念和使用 1.1、什么是分支&#xff1f; 分支&#xff08;Branch&#xff09;是在版本控制中非常重要的概念。幾乎所有版本控制系統都支持某種形式的分支。在 Git 中&#xff0c;分支是 Git 強大功能之一&#xff0c;它允許我們從主開發線分離出來&#xff0c;在不…

mapbox基礎,加載F4Map二維地圖

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性二、??F4Map 簡介2.1 ??技術特點2.2 ??核…

Conda使用方法詳解

Conda是一個開源的包管理和環境管理系統&#xff0c;主要用于Python/R等科學計算領域&#xff0c;可以輕松管理不同項目的依賴關系。以下是Conda的詳細使用方法&#xff1a; 一、安裝與配置 1.安裝Miniconda/Anaconda Miniconda是精簡版&#xff0c;只包含conda和Python Ana…

Unity ViewportConstraint

一、組件功能概述 ViewportConstraint是一個基于世界坐標的UI邊界約束組件&#xff0c;主要功能包括&#xff1a; 將UI元素限制在父容器范圍內支持自定義內邊距&#xff08;padding&#xff09;可獨立控制水平和垂直方向的約束 二、實現原理 1. 邊界計算&#xff08;世界坐…

代碼隨想錄-動態規劃24

leetcode-300-最長遞增子序列 dp[i]表示i之前包括i的以nums[i]結尾的最長遞增子序列的長度 dp[j]是(0,i-1)不包括i的以nums[i-1]結尾的最長遞增子序列長度 int lengthOfLIS(int* nums, int numsSize) {if(numsSize < 1)return numsSize;int dp[numsSize];for(int i 0 ; i &…

銀河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑夢之路

環境說明 1. 操作系統版本: 銀河麒麟V10 2. CPU架構&#xff1a;X86 3. Python版本&#xff1a;3.12.9 4. 大模型&#xff1a;mistral:7b-instruct 準備工作 1. 編譯安裝python 3.12 # 下載python 源碼wget https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tg…

2025 跨平臺技術如何選:KMP 與 Flutter 的核心差異

前言 在移動開發的演進歷程中&#xff0c;跨平臺技術始終是一個充滿爭議卻無法回避的話題。從早期的 React Native 到如今的 Kotlin Multiplatform&#xff08;KMP&#xff09;和 Flutter&#xff0c;開發者們始終在代碼復用與原生體驗之間尋找平衡。本文我們從技術實現、性能…

Python Cookbook-5.10 選取序列中最小的第 n個元素

任務 需要根據排名順序從序列中獲得第n個元素(比如&#xff0c;中間的元素&#xff0c;也被稱為中值)。如果序列是已經排序的狀態&#xff0c;應該使用seq[n]&#xff0c;但如果序列還未被排序&#xff0c;那么除了先對整個序列進行排序之外&#xff0c;還有沒有更好的方法? …

列表之鏈表_C

數據結構&#xff08;鄧俊輝&#xff09;&#xff1a;列表及相關概念_listnodeposi-CSDN博客 #include <stdio.h> #include <stdlib.h>// 定義Rank類型為int typedef int Rank;// 定義ListNode結構體 typedef struct ListNode {int data;struct ListNode* pred;st…

0401react中使用css-react-css-仿低代碼平臺項目

文章目錄 1、普通方式-內聯使用css2、引入css文件2.1、示例2.2、classnames 3、內聯css與引入css文件對比3.1、內聯css3.2、 外部 CSS 文件&#xff08;External CSS&#xff09; 4、css module5、sass6、classnames組合scss modules7、css-in-js7.1、CSS-in-JS 的核心特性7.2、…

鴻蒙開發者高級認證編程題庫

題目一:跨設備分布式數據同步 需求描述 開發一個分布式待辦事項應用,要求: 手機與平板登錄同一華為賬號時,自動同步任務列表任一設備修改任務狀態(完成/刪除),另一設備實時更新任務數據在設備離線時能本地存儲,聯網后自動同步實現方案 // 1. 定義分布式數據模型 imp…

stream流Collectors.toMap(),key值重復問題

文章目錄 一、問題二、問題示例三、原因四、解決方法4.1、方案一 一、問題 發現Collectors.toMap的一個坑&#xff0c;若key值重復的時候會拋異常。如&#xff1a; IllegalStateException: Duplicate key 男 二、問題示例 報錯示例如下&#xff1a; import lombok.AllArgsC…