深入探究 JVM 堆的垃圾回收機制(一)— 判活

垃圾回收分為兩步:1)判定對象是否存活。2)將“消亡”的對象進行內存回收。

1 判定對象存活

可達性分析算法:通過一系列“GC Roots”對象作為起始節點集,從這些節點開始,根據引用關系向下搜索,搜索過程所走的路徑為“引用鏈”,如果某個對象到“GC Roots”沒有任何引用鏈相連,則判定該對象“消亡”。

強引用

正常引用,可達性分析搜索的只有強引用

軟引用

關聯還有用,但非必須的對象。在系統將要發生內存溢出時,會把這些對象列入回收范圍。

弱引用

比軟引用更弱,只能生存到下次垃圾收集發生之前。

虛引用

最弱,無法通過虛引用來取得一個對象實例。唯一作用是在則會個對象被回收時收到一個系統通知。

表 Java 的引用類型

1.1 三色標記

圖 可達性分析算法“三色標記”演示過程

1.1.1“對象消失”

垃圾回收器與用戶線程并發執行,若以下兩個條件同時成立,對象消失必然發生。

  1. 用戶線程將黑色對象指向一個白色對象。
  2. 用戶刪除所有從灰色對象到該白色對象的引用。

注意:對于在并發期間新建的對象,JVM會把其標記為黑色或灰色。

1.1.2 寫屏障

寫屏障是一段嵌入在對象引用賦值操作中的代碼邏輯(類似AOP)。JVM通過寫屏障實現兩種方式來解決上面“對象消失”的問題。

增量更新

破壞第1個條件。當黑色對象插入新指向到白色對象時,寫屏障將新插入引用記錄下來,等并發掃描結束,再將記錄過的引用關系中黑色對象集作為根,重新掃描一次。

效率更低。

原始快照

破壞第2個條件。當灰色對象要刪除指向白色對象的引用關系時,寫屏障將要刪除的引用關系記錄下來,等并發掃描結束,再將記錄過的引用關系中白色對象集作為根,重新掃描一次。

會產生浮動垃圾。

表 “對象消失”的解決方案

1.2 GC Roots 對象

主要有:1) 棧中引用的對象。2)本地方法棧中引用的對象。3)方法區中靜態屬性引用的對象及常量引用的對象。4)JVM 內部的引用。5)被同步鎖持有的對象等。

獲取GC Roots 集必須在一個能保障一致性的快照中才能進行,因此需要STW(Stop The Word)。

1.2.1 棧幀

棧幀是單個線程在方法調用時在棧中分配的內存區域,用于存儲方法的執行狀態。每個方法從調用到執行完成,對應一個棧幀的入棧和出棧。

圖 棧幀內存布局

局部變量表

存儲方法的參數、局部變量以及部分中間結果。

以變量槽(Slot)為基本單位,每個Slot占用4個字節。對于8個字節的變量,占用兩個連續的Slot。

索引分配:

非靜態方法第0位Slot存儲this引用。

方法參數從第1位依次存儲。

局部變量按聲明順序分配Slot。

操作數棧

存儲方法執行過程中的操作數。

動態鏈接

存儲指向運行時常量池中該方法的符號引用。

方法返回地址

存儲方法退出后需要返回到的調用者位置。

附加信息

行號表、局部變量表描述符等。

表 棧幀內存組成

1.2.2 OopMap

收集線程需要遍歷方法棧中每一個棧幀,來收集被引用的變量。如果對棧幀的局部變量表進行全表掃描,很耗時。

OopMap(ordinary object pointer Map)普通對象地圖,用于描述棧幀中對象引用的位置。它通常是一個位圖,每個位對應局部變量表中一個槽位。1表示該槽位有對象引用,0表示沒有。例如,假設局部變量表一共有8個槽位,其中只有第1個及第3個槽位有對象引用,則OopMap表示為10100000。

一個棧幀包含多個OopMap。

1.2.3 安全點

引發引用關系變化的指令很多,無法為每一條指令都生成對應的OopMap,只會在某些位置生成,這些位置被稱為安全點。

安全點選擇的原則:平衡線程響應速度和性能開銷。

安全點常用位置:方法調用、循環末尾、異常處理路徑等。

主動式中斷

主流方案,當需要GC Roots收集時,JVM在內存中設置一個標識位,用戶線程每次到達安全點都會輪詢標識位,如果需要中斷,則主動掛起。

被動式中斷

通過操作系統信號強制中斷線程,如果有用戶線程未到達安全點,則恢復該線程,讓其到達安全點后再中斷。

表 安全點的實現方案

缺陷:

1)本地方法無法設置安全點。

2)對于未插入安全點但需要長時間執行的指令(如循環),如果在循環提中未插入安全點,則需要等待循環完成才能到達安全點。

3)如果線程在安全點被阻塞或sleep,因為其被喚醒的時間不能確定,JVM無法等到該線程到達安全點。

4)如果為線程阻塞或sleep指定插入安全點,則需要插入安全點的地方會增加,會加重程序的負擔。

1.2.5 安全區域

在某段代碼片段中,引用關系不會發生變化,這個區域任何地方開始收集GC Roots都是安全的,這個區域稱為安全區域。

當用戶線程執行到安全區域時,會標識自己已進入安全區域。這段時間里JVM要進行GC Roots收集就可不必中斷在安全區域內的線程,當線程要離開安全區域時,會先檢測JVM是否完成了GC Roots枚舉,如果完成,則線程繼續執行,否則等待。

安全區域的應用場景:

  1. 本地代碼的執行,當用戶線程進入本地方法時就標識自己進入了安全區域。
  2. 統一管理線程多種阻塞狀態,只有線程處于阻塞狀態,即視為進入安全區域。
  3. 避免“長時間無安全點”的僵局,如在循環體中沒有安全點,則標識為進入了安全區域。

安全區域是對安全點的必要補充。

1.3 對象回收判定

要正式宣告對象死亡,最少要經歷兩次標記過程:

  1. 可達性分析后進行第1次標記。
  2. 對上面標記的對象進行篩選,如果這些對象實現了finalize()方法,則會調用這個方法,這是對象唯一次復活的機會,否則宣告對象死亡。

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

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

相關文章

國產開發板—米爾全志T113-i如何實現ARM+RISC-V+DSP協同計算?

近年來,隨著半導體產業的快速發展和技術的不斷迭代,物聯網設備種類繁多(如智能家居、工業傳感器),對算力、功耗、實時性要求差異大,單一架構無法滿足所有需求。因此米爾推出MYD-YT113i開發板(基…

Tomcat虛擬主機配置詳解:Centos環境下多域名部署(詳細教程!)

🏡作者主頁:點擊! Tomcat服務器📝專欄:點擊! 🐧Linux高級管理防護和群集專欄:點擊! ??創作時間:2025年3月18日14點14分 最近在折騰 Tomcat 的時候&…

鴻蒙開發工程師簡歷項目撰寫全攻略

一、項目結構的黃金法則 建議采用「41」結構: 項目背景(業務價值)技術架構(鴻蒙特性)核心實現(技術難點)個人貢獻(量化成果)附加價值(延伸影響) …

dfs刷題排列問題 + 子集問題 + 組和問題總結

文章目錄 一、排列問題全排列II題解代碼 優美的排列題解代碼 二、子集問題字母大小寫全排列題解代碼 找出所有子集的異或總和再求和題解代碼 三、組合問題電話號碼的字母組合題解代碼 括號生成題解代碼 組合題解代碼 目標和題解代碼 組合總和題解代碼 總結 一、排列問題 全排列…

【Linux】VMware17 安裝 Ubuntu24.04 虛擬機

目錄 安裝教程 一、下載 Ubuntu 桌面版iso映像 二、安裝 VMware 三、安裝 Ubuntu 桌面版 VMware 創建虛擬機 掛載 Ubuntu ISO 安裝 Ubuntu 系統 安裝教程 一、下載 Ubuntu 桌面版iso映像 鏈接來自 清華大學開源軟件鏡像站 ISO文件地址:ubuntu-24.04.2-des…

CVPR2025 | 對抗樣本智能安全方向論文匯總 | 持續更新中~

匯總結果來源:CVPR 2025 Accepted Papers 若文中出現的 論文鏈接 和 GitHub鏈接 點不開,則說明還未公布,在公布后筆者會及時添加. 若筆者未及時添加,歡迎讀者告知. 文章根據題目關鍵詞搜索,可能會有遺漏. 若筆者出現…

PostgreSQL_數據回退,數據庫導出、導入

目錄 前置: 1 數據回退 1.1 代碼 1.2 pgAdmin4 中查看 1)t_daily 2) t_stock_daily 2 數據庫導出、導入 前置: 本博文是一個系列。在本人“數據庫專欄”-》“PostgreSQL_”開頭的博文。 1 數據回退 上一節“PostgreSQL_數據下載并…

golang單機鎖實現

1、鎖的概念引入 首先,為什么需要鎖? 在并發編程中,多個線程或進程可能同時訪問和修改同一個共享資源(例如變量、數據結構、文件)等,若不引入合適的同步機制,會引發以下問題: 數據競…

【HarmonyOS Next】鴻蒙應用實現彈框DialogHub詳解

【HarmonyOS Next】鴻蒙應用實現彈框DialogHub詳解 一、前言 鴻蒙中實現彈框目前官方提供openCustomDialog和CustomDialog兩種模式。推薦前者,詳情見下圖和官網文檔鏈接: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-u…

機器學習算法實戰——天氣數據分析(主頁有源碼)

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ? ??? 1. 引言 天氣數據分析是氣象學和數據科學交叉領域的一個重要研究方向。隨著大數據技術的發展,氣象數據的采集、存儲和分…

輸電線路專業英語詞匯

輸電線路transmission line 雙回路double circuit 導線conductor 地線ground (Earth)wire 雙回路耐張塔double-circuit tension towers 直線塔tangent tower 地質Geological 水文Hydrological 塔位坐標Coordinate of Tower Location 轉角塔angle tower 直…

炫酷的3D按鈕效果實現 - CSS3高級特性應用

炫酷的3D按鈕效果實現 - CSS3高級特性應用 這里寫目錄標題 炫酷的3D按鈕效果實現 - CSS3高級特性應用項目介紹核心技術實現1. 基礎結構設計2. 視覺效果實現2.1 背景漸變2.2 立體感營造 3. 交互動效設計3.1 懸停效果3.2 按壓效果 技術要點分析1. 深度層次感2. 動畫過渡3. 性能優…

解決python配置文件類configparser.ConfigParser,插入、讀取數據,自動轉為小寫的問題

配置類 [Section1] Key_AAA Value[Section2] AnotherKey Value默認情況下,ConfigParser會將ini配置文件中的KEY,轉為小寫。 重載后配置類: 繼承類從configparser.ConfigParser改為configparser.RawConfigParser重載方法optionxform&#…

微服務的網關配置

微服務的網關配置 1. 網關路由 1.1 網關 1.1.1 存在問題 單體架構時我們只需要完成一次用戶登錄、身份校驗,就可以在所有業務中獲取到用戶信息。而微服務拆分后,每個微服務都獨立部署,這就存在一些問題:每個微服務都需要編寫身…

【硬核實戰】ETCD+AI智能調度深度整合!從架構設計到調優避坑,手把手教你打造高可用調度系統!

一、核心架構設計:ETCD如何賦能AI調度? 🔥 架構圖: [AI調度引擎] ← 實時數據 → [ETCD集群] ↓ 決策指令 [執行層(車輛/物流/交通設備)] 核心角色: ETCD:存儲調度策略、節點狀…

區間震蕩指標

區間震蕩指標的邏輯如下: 一、函數注解 1. Summation函數 功能: 計算給定價格序列Price的前Length個數據點的和,或在數據點數量超過Length時,計算滾動窗口內的價格和。 參數: Price(1):價格序列&#…

C語言-數組指針和指針數組

指針 數組指針與指針數組 數組指針 定義 概念:數組指針是指向數組的指針,本質上還是指針 特點: ①先有數組,后有指針 ②它指向的是一個完整的數組 一維數組指針 語法: 數據類型 (*指針變量名)[容量]; 案例&a…

31天Python入門——第5天:循環那些事兒

你好,我是安然無虞。 文章目錄 1. while循環1.1 while循環的嵌套1.2 補充學習:print函數 2. for循環2.1 range函數2.2 for循環2.3 continue和break以及return2.4 for循環的嵌套 3. 補充學習3.1 enumerate函數3.2 zip函數3.3 不要在遍歷列表的過程中刪除元素 循環 是…

T3 出行:網約車全棧分布式數據庫升級實踐

現今,網約車已成為民眾日常出行不可或缺的選擇。伴隨“互聯網出行”模式的快速推進,龐大的出行數據應運而生,如同構建了城市交通系統的數字神經脈絡。與此同時,對高效數據存儲與深入數據分析的需求也在持續攀升。 T3 出行于2019年…

區塊鏈技術在供應鏈管理中的應用與創新

在當今全球化的商業環境中,供應鏈管理的復雜性與日俱增。從原材料采購到最終產品交付,涉及眾多環節和參與者,信息的透明度、準確性和安全性至關重要。區塊鏈技術的出現,為供應鏈管理帶來了全新的解決方案,正在逐步改變…