深入理解JVM的垃圾收集(GC)機制

引言

首先我們來介紹垃圾收集的概念,什么是垃圾收集?

? ? ? ? 垃圾收集?(Garbage Collection,GC),顧名思義就是釋放垃圾占用的空間,防止內存爆掉。有效的使用可以使用的內存,對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收。

垃圾收集需要完成的三件事情

? ? ? ? 哪些是垃圾?

? ? ? ? 怎么樣回收?

? ? ? ? 什么時間回收?

? ? ? ? 既然JVM要進行垃圾收集,首先就要判定哪些是垃圾?


?1. 哪些是垃圾

????????我們要判定哪些對象還“存活”著,哪些已經“死去”,有兩種算法:引用計數法可達性分析

1.1?腦門刻字法- 引用計數法

?思路

????????在對象中添加一個引用計數器,通過計數器的加一減一操作,引用就加一,失效就減一。為零就回收。

????????引用計數算法看似很美好,但實際上它存在一個很大的問題,那就是無法解決循環依賴的問題。

public static void testGC() {
ReferenceCountingGC objA = new ReferenceCountingGC();
ReferenceCountingGC objB = new ReferenceCountingGC();
objA.instance = objB;
objB.instance = objA;
objA = null;
objB = null;
// 假設在這行發生GC,objA和objB是否能被回收?
System.gc();
}

????????如果a和b相互引用,然后將這兩個對象的引用設置為 null,理論上它們會在接下來被垃圾回收器回收。但由于它們相互引用著對方,導致它們的引用計數永遠都不會為 0,通過引用計數算法,也就永遠無法通知 GC 收集器回收它們。

1.2?平地長樹法-可達性分析

思路:? ? ?

????????大白話就是:只要與GC Roots根對象關聯上,就不回收。

? ? ? ? 正式的話就是:通過 GC Roots 作為起點,然后向下搜索,搜索走過的路徑被稱為 Reference Chain(引用鏈),當一個對象到 GC Roots 之間沒有任何引用相連時,即從 GC Roots 到該對象節點不可達,則證明該對象是需要垃圾收集的。

????????所謂的 GC Roots,就是一組必須活躍的引用,不是對象,它們是程序運行時的起點,是一切引用鏈的源頭。在 Java 中,GC Roots 包括以下幾種:

  • 虛擬機棧中的引用(方法的參數、局部變量等)
  • 本地方法棧中 JNI (Java Native Interface)的引用
  • 類靜態變量
  • 運行時常量池中的常量(String 或 Class 類型)

2. 怎么樣回收

2.1 分代假說

分代收集理論

????????比如:有一堆2分鐘就要被清理的和一堆兩個小時的被清理的。分成兩堆

????????強分代假說:活得越久的,就越傾向于活下去 老年代 占2

????????弱分代假說:大部分朝生夕滅。 新生代 占1

????????跨代引用假說: 僅占極少數 (死的賊快的早死了,死的慢的就直接老年代了。)? ?

? ? ? ? ? ? ? ? 實現:在新生代建立一個全局的數據結構,這個結構把老年代劃分成若干個小塊,標識出老年代的哪一塊內存會存在跨代引用。包含了跨代引用小塊內存的對象會被加入GCRoots。

2.2 收集算法

1》標記清除

????????標記出要被回收的對象,標記完成后回收這些標記的對象。或者標記出存活的對象,回收未被標記的。

????????優勢:實現簡單

????????劣勢:①產生空間碎片問題

??????????????????②stop the world(在打標記的過程中,不能有新的對象產生。或者新的對象不打標記)

解決空間碎片化:

????????標記復制

2》標記復制

????????把內存劃分為容量相同的兩塊,每次只使用其中的一塊。當這一塊內存滿了,就將還存活的對象復制到另外一塊上,把原來滿的那塊內存清理掉。

????????好處:沒有空間碎片,實現簡單高效

????????壞處:收集效率不高的時候,使用這個算法不合適

???????????????????僅適用于收集效率高,朝生夕死合適

? ? ? ? ? ? ? ? ? ?只有一半的有效空間,另一半只能等著

????????優化:把整個新生代劃分成三部分

3》標記整理

????????適用于老年代。標記出要被回收的對象或者存活的對象,將所有存活的對象都向內存空間一端移動,然后清理掉邊界以外的內存。

????????好處:整理完后,沒有空間碎片

????????壞處:需要移動對象


Stop?The? World

????????"Stop The World"是 Java 垃圾收集中的一個重要概念。在垃圾收集過程中,JVM 會暫停所有的用戶線程,這種暫停被稱為"Stop The World"事件。

????????這么做的主要原因是為了防止在垃圾收集過程中,用戶線程修改了堆中的對象,導致垃圾收集器無法準確地收集垃圾。

????????值得注意的是,"Stop The World"事件會對 Java 應用的性能產生影響。如果停頓時間過長,就會導致應用的響應時間變長,對于對實時性要求較高的應用,如交易系統、游戲服務器等,這種情況是不能接受的。

????????因此,在選擇和調優垃圾收集器時,需要考慮其停頓時間。Java 中的一些垃圾收集器,如 G1 和 ZGC,都會盡可能地減少了"Stop The World"的時間,通過并發的垃圾收集,提高應用的響應性能。

????????總的來說,"Stop The World"是 Java 垃圾收集中必須面對的一個挑戰,其目標是在保證內存的有效利用和應用的響應性能之間找到一個平衡。

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

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

相關文章

【筆記】國標-機動車輛及掛車分類

源于:GB/T 15089-2001機動車輛及掛車分類 1.L類:兩輪或三輪車輛2.M類:四輪載客車輛3.N類:四輪載貨車輛4.O類:掛車5.G類:其他

VLLM部署DeepSeek-LLM-7B-Chat 模型

一、部署環境準備1. 基礎環境要求操作系統:Linux(推薦歐拉系統、Ubuntu 等)Python 版本:3.8 及以上依賴工具:pip、git、curl可選依賴:GPU 環境:NVIDIA GPU(支持 CUDA 11.7&#xff0…

翱翔的智慧之翼:Deepoc具身智能如何賦能巡檢無人機“讀懂”工業現場

翱翔的智慧之翼:Deepoc具身智能如何賦能巡檢無人機“讀懂”工業現場在百米高的風力發電機葉片頂端,在蜿蜒數十公里的高壓輸電線旁,在油氣管道穿越的崇山峻嶺之上,一架四旋翼無人機正精準地懸停著,它的“眼睛”&#xf…

Java大廠面試實錄:謝飛機的電商場景技術問答(Spring Cloud、MyBatis、Redis、Kafka、AI等)

Java大廠面試實錄:謝飛機的電商場景技術問答(Spring Cloud、MyBatis、Redis、Kafka、AI等)本文模擬知名互聯網大廠Java后端崗位面試流程,以電商業務為主線,由嚴肅面試官與“水貨”程序員謝飛機展開有趣的對話&#xff…

Kotlin基礎

前言 Decrement(遞減) → 將一個值減 1 的操作 Predicate(謂詞) → 返回布爾值(邏輯值)的函數 Reference(引用) → 允許使用自定義名稱與對象交互 Runtime(運行時&…

預防DNS 解析器安全威脅

DNS 是互聯網的重要基礎,例如 Web 訪問、email 服務在內的眾多網絡服務都和 DNS 息息相關,DNS 的安全則直接關系到整個互聯網應用能否正常使用。 DNS 解析器的作用是將用戶輸入的域名轉換為對應的 IP 地址,以便計算機能夠準確地定位并連接到…

Windows下VScode配置FFmpeg開發環境保姆級教程

相關準備 提前在本地開發環境中配置好mingw64或者msys2開發工具集。 安裝VScode軟件。 下載Windows版本的FFmpeg相關庫 下載地址:https://ffmpeg.org/download.html 下載步驟:如下圖。 下載后的文件:包含了可執行文件ffmpeg、ffpl…

Lecture #19 : Multi-Version Concurrency Control

CMU15445課程筆記多版本并發控制 多版本并發控制講的是Mvcc。 即維護單個邏輯對象的多個物理版本, 這樣當一個事務讀取某個對象的時候不會阻塞其他事務寫入該對象; 反之亦然。 但是Mvcc不保護寫寫沖突, 對于這種情況, 可能需要其兩…

imx6ul Qt運行qml報錯This plugin does not support createPlatformOpenGLContext!

imx6ul運行qml的Qt程序報錯This plugin does not support createPlatformOpenGLContext!1、開發環境2、問題復現3、解決辦法第一種方法第二種方法4、結論1、開發環境 主板:imx6ul Qt版本:5.9.6 文件系統:buildroot 問題描述:現需…

軟考中項系統集成第 5 章:軟件工程全流程考點拆解,備考邏輯清晰

備考系統集成項目管理工程師的小伙伴們,福利來啦!今天開始為大家帶來《系統集成項目管理工程師(第 3 版)》考點的思維導圖,今天帶來的是第5章。第 5 章聚焦軟件工程,涵蓋軟件工程定義、軟件需求、軟件設計、…

ICLR 2025 | InterpGN:時間序列分類的透明革命,Shapelet+DNN雙引擎驅動!

在Rensselaer理工學院、Stony Brook大學與IBM Research的合作下,本文聚焦于如何在時間序列分類任務中兼顧性能與可解釋性。傳統深度學習模型雖然準確率高,卻常被詬病為“黑盒”,難以贏得如醫療等高風險領域的信任。為此,作者提出了…

使用ENO將您的JSON對象生成HTML顯示

ENO 是簡單易用,性能卓越,自由靈活開源的 WEB 前端組件;實現 JSON 與 HTML 互操作的 JavaScript 函數庫。沒有任何其它依賴,足夠輕量。 WEBPack NPM 工程安裝。 npm install joyzl/eno 然后在JS中引用 import "joyzl/eno…

7.12 卷積 | 最小生成樹 prim

lc1900.模擬比賽算出兩個指定選手最早和最晚能在第幾輪碰到。還是建議dfs捏模擬比賽,找出兩個特定選手(firstPlayer和secondPlayer)最早和最晚相遇的輪次。1. 定義了一個“選手”結構體,包含兩個屬性a(戰斗力&#xff…

LVS-NAT模式配置

目錄 1、負載調度器配置 配置IP地址 安裝ipvsadm 開啟路由轉發功能 加載ip_vs模塊 啟動ipvsadm服務 配置負載分配策略 查看驗證 2、web節點配置 3、測試 1、負載調度器配置 配置IP地址 增加一塊網卡 cd /etc/sysconfig/network-scripts/ cp ifcfg-ens192 ifcfg-ens…

中國銀聯豪擲1億采購海光C86架構服務器

近日,中國銀聯國產服務器采購大單正式敲定,基于海光C86架構的服務器產品中標,項目金額超過1億元。接下來,C86服務器將用于支撐中國銀聯的虛擬化、大數據、人工智能、研發測試等技術場景,進一步提升其業務處理能力、用戶…

web網頁,在線%食譜推薦系統%分析系統demo,基于vscode,uniapp,vue,java,jdk,springboot,mysql數據庫

經驗心得兩業務單,項目前端在VSCode、HBuilder環境下整合Uniapp、Vue。后端使用Java、SpringBoot和MySQL,使用這些技術棧咱們就可以搭建在線食譜推薦與分析功能的系統,技術棧雖涉及前后端及數據庫跨度不小,但咱們拆分模塊去開發它難度就會變小…

MCP架構:AI時代的標準化上下文交互協議

本文深入解析Model Context Protocol(MCP)架構的創新設計,這是一種由Anthropic提出的標準化協議,旨在解決大型語言模型(LLM)與外部工具和數據源交互的碎片化問題。MCP采用客戶端-服務器架構,通過…

機器學習數據集加載全攻略:從本地到網絡

目錄 一、加載內置數據集 1.1 Iris鳶尾花數據集 1.2 其他常用內置數據集 二、加載網絡數據集 2.1 20 Newsgroups數據集 三、加載本地數據集 3.1 使用pandas加載CSV文件 3.2 處理常見問題 四、數據加載最佳實踐 五、總結 在機器學習項目中,數據的加載是第一…

【操作系統】進程(二)內存管理、通信

JavaEE—進程(二)內存管理、通信 一、內存管理 1.映射訪問 2.獨立分布 防崩潰 二、通信 1.獨立性保障 2.方式 2.1管道 2.1.2特點 2.1.2.1進程條件 2.1.2.2方向 2.1.2.3同步性 2.1.2.4性能 2.2消息隊列 2.2.1特點 2.2.1.1方向 2.2.1.2同步性 2.2.1.3性能 2.3…

windows 裝了 python2 和 python3 如何切換默認版本

現在執行 python --version 是Python 3.11.3怎么讓 python 默認是 python2,而 python3 --version 是執行 pyhon3 呢cmd 執行 where pythonC:\Users\huyun\AppData\Local\Programs\Python\Python311-32\python.exe C:\Users\huyun\AppData\Local\Microsoft\WindowsAp…