HotSpot的算法細節

可達性分析算法

以一系列“GC Roots”根對象作為起始節點集,從這些節點開始,根據引用關系向下搜索,搜索過程所走過的路徑稱為“引用鏈”(Reference Chain),如果某個對象到GC Roots間沒有任何引用鏈相連, 或者用圖論的話來說就是從GC Roots到這個對象不可達時,則證明此對象是不可能再被使用的。

從GC Roots開始向下進行引用搜索,如果某對象和任何GC Root沒有關聯,則認為該對象不再被使用。

GC Roots

  • 虛擬機棧中引用的對象,對應虛擬機方法棧中當前執行的方法所使用的參數,局部變量,臨時變量等。
  • 方法區中:類的靜態變量,常量
  • 本地方法棧中引用的對象

記憶集與卡表

記憶集是一種用于記錄從非收集區域指向收集區域的指針集合的抽象數據結構。

卡表:是記憶集的一種實現形式,采用的是“卡精度”的方式實現記憶集。卡精度指精確到一塊內存區域(該內存區域又稱為“卡頁”),這個區域內有跨代指針的話,就將其標識出來(實際是使用的0/1標識);

在進行GCROOTS掃描時,同時再去篩選卡表中變臟的元素(掃描指定的內存區域塊),可以快速定位到關聯區域,將跨區引用的對象一起加入GCROOTS掃描。

寫屏障

寫屏障主要解決的是卡表元素的維護更新,即處理卡表變臟的問題。

何時變臟:其他分代區域有對象引用了該區域對象時,其對應的卡表元素則變臟。

寫屏障的處理類似于一個AOP切面,即在本區對象被引用時,添加了Around環繞通知,可在引用賦值前后添加寫前屏障和寫后屏障。通常虛擬機在寫后屏障中增加維護卡表的操作。

卡表在高并發場景下還存在偽共享的問題,由于64個卡表共享一個緩存行,當多個線程更新同一緩存行數據時,會出現并發更新影響性能的情況。

同時虛擬機提供-XX:+UseCondCardMark參數配置,開啟該參數則會預先檢查該卡表是否已變臟,再行更新的策略。對未變臟的進行更新,已經變臟的卡表不再更新。開啟該參數增加異常額外判斷的開銷,但可以避免偽共享的問題

SATB(snapshot at the beginning)原始快照

沿著GCRoots進行并發掃描時,通常用戶線程也在并發執行。這時會面臨著已經被垃圾收集器掃描的對象圖被用戶線程更改的情況。

情況一:某些對象被用戶線程斷開了引用,其實該對象已經成為垃圾,現在仍被垃圾收集器標識為存活

情況二:某些被垃圾收集器標識為垃圾的對象被用戶線程重新引用,導致存活對象被垃圾收集器回收了

綜合以上兩種情況可知,情況一其實可以容忍,只是程序產生了一些浮動垃圾,待下一次垃圾收集時可以一并回收。情況二把原本存活的對象標記為了死亡,則會造成程序的致命錯誤。

關于情況二即并發掃描時的對象消失問題,不同的垃圾收集器的解決辦法不同。CMS中使用增量更新的方式,G1和shenandoah采用原始快照的方式。

CMS使用增量更新的方式:

當有黑色對象插入指向白色對象的引用時,就將這個引用關系記錄下來。在并發掃描結束后(最終標記),以這些黑色對象為根再次進行掃描一次。

垃圾收集器掃描完成的對象引用了一個未被掃描過(新創建或已斷開引用)的對象,會將該引用關系記錄下來,在最終標記階段再以該新創建的對象為根,再次進行掃描一次。

G1和shenandoah的原始快照方式:

當灰色對象要刪除一個指向白色對象的引用時,就將該要刪除引用關系記錄下來。在并發掃描結束再以這些灰色對象為根進行掃描一次。這種做法最終導致無論關系刪除與否,都會按照垃圾收集器開始掃描的那一刻的對象圖來進行對象搜索。

TAMS(Top at mark start)標記頂部

G1收集器中的概念,G1為每個region設計兩個TAMS的指針,用于在并發回收階段新的對象的分配。在回收階段新對象分配的內存地址將落在region的兩個TAMS指針之間。G1默認在兩個指針之間的對象是存活的,不對其進行垃圾回收。

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

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

相關文章

Transformer數學推導——Q27 證明時序注意力(Temporal Attention)在視頻模型中的幀間依賴建模

該問題歸類到Transformer架構問題集——注意力機制——跨模態與多模態。請參考LLM數學推導——Transformer架構問題集。 在視頻理解任務中,捕捉幀與幀之間的時間依賴關系(如動作的連貫性、物體的運動軌跡)是核心挑戰。時序注意力&#xff08…

服務器和數據庫哪一個更重要

在當今數字化的時代,服務器和數據庫都是構建和運行各種應用系統的關鍵組成部分,要說哪一個更重要,其實很難簡單地給出定論。 服務器就像是一個強大的引擎,為應用程序提供了穩定的運行環境和高效的計算能力。它負責接收和處理來自…

【Android】四大組件之Service

目錄 一、什么是Service 二、啟停 Service 三、綁定 Service 四、前臺服務 五、遠程服務擴展 六、服務保活 七、服務啟動方法混用 你可以把Service想象成一個“后臺默默打工的工人”。它沒有UI界面,默默地在后臺干活,比如播放音樂、下載文件、處理…

pytest 技術總結

目錄 一 pytest的安裝: 二 pytest有三種啟動方式: 三 用例規則: 四 配置框架: 一 pytest的安裝: pip install pytest # 安裝 pip install pytest -U # 升級到最新版 二 pytest有三種啟動方式: 1…

redis 有序集合zrange和zrangebyscore的區別

起因是查詢數據,用了zrangebyscore 但是一直顯示沒數據 具體命令zrangebyscore key 0 -1 withscores, 原有印象中一直是這么用的,但是突然查不出來了, 于是搜了下問題所在。 通過分數查看 不能用0和-1表示最小和最大,只能用分數來…

Tableau 基礎表制作

目錄 1.數據連接 2. 數據可視化 3. 基礎表制作 3.1 對比分析:比大小 1. 柱狀圖 2. 條形圖 3. 熱力圖 4. 氣泡圖 5. 詞云 3.2 變化分析:看趨勢 1. 折線圖 2. 面積圖 3.3 構成分析:看占比 1. 餅圖 2. 樹地圖 3. 堆積圖 3.4 關…

反序列化漏洞1

一、PHP類與對象 1. 類 概念理解: 類是共享相同結構和行為的對象的集合,可以理解為特征的提取。例如將耳朵長、尾巴短、紅眼睛、吃胡蘿卜、蹦跳行走的動物特征抽象為"兔子"類。代碼結構: 使用class關鍵字定義類類名遵循大駝峰命名法包含成員變量(屬性)和…

為什么要對 ACI 網絡進行升級?

一、硬件演進 1. 交換機接口 前面板接口由 1/10G 升級至 10/25/100G fabric 上行鏈路 40G 升級至 100/400G 2. 交換機角色 交換機可以是 spine 或者 leaf,而不是固定角色 3. EOS APIC-SERVER-M2/L2 2024年6月30日 EOS,替換設備為 APIC-SERVER-M4/L4 二、網絡升級參考文…

DeepSeek+Cline:開啟自動化編程新紀元

目錄 一、引言:AI 編程時代的曙光二、認識 DeepSeek 和 Cline2.1 DeepSeek 是什么2.2 Cline 詳解2.3 兩者結合的魅力 三、DeepSeek Cline 安裝與配置全流程3.1 安裝 VS Code3.2 安裝 Cline 插件3.3 獲取 DeepSeek API Key3.4 配置 Cline 與 DeepSeek 連接 四、實戰演…

【展位預告】正也科技將攜營銷精細化管理解決方案出席中睿營銷論壇

在醫藥行業面臨政策深化、技術迭代、全球化競爭的多重挑戰下,第二屆中睿醫藥健康生態生長力峰會暨第三十五屆中睿醫藥營銷論壇將于廣州盛大啟幕。5月19-20日本次峰會以“聚焦政策變革、把握產業趨勢、構建生態共贏”為核心,旨在通過全產業鏈資源整合與創…

【深度學習】評估模型復雜度:GFLOPs與Params詳解

評估模型復雜度:GFLOPs與Params詳解 在深度學習模型設計與優化過程中,GFLOPs和Params是論文中兩個重要的評估指標,它們分別衡量模型的計算復雜度和參數量。本文將詳細介紹這兩個概念及其在實踐中的應用。 1. Params:模型參數量 …

Go語言->練習6例

1.go語言的接口實現 接口(interface)是一種類型,它定義了一組方法的集合。任何類型只要實現了接口中定義的所有方法,就被認為實現了該接口。 在Go語言中,使用接口的最佳實踐可以提高代碼的可讀性、可維護性和靈活性。…

Drivestduio 代碼筆記與理解

Rigid Node: 表示 car或者trucks Deformable Node : 表示一些 分布之外的 non-rigid 的運動物體, 比如遠處的行人等和Cyclist。 在 load_objects 會讀取每一個 dynamic objects 的 bounding box’的信息,具體如下: frame_instances 記錄了每…

《算法筆記》10.5小節——圖算法專題->最小生成樹 問題 E: Jungle Roads

題目描述 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to mai…

【音視頻】SDL簡介

官網:官網 文檔:文檔 SDL(Simple DirectMedia Layer)是一套開放源代碼的跨平臺多媒體開發庫,使用C語言寫成。SDL提供數種控制圖像、聲音、輸出入的函數,讓開發者只 要用相同或是相似的代碼就可以開發出跨多…

SpringBoot + SSE 實時異步流式推送

前言 在當今數字化時代,實時數據處理對于企業的決策和運營至關重要。許多業務場景需要及時響應數據庫中的數據變化,例如電商平臺實時更新庫存、金融系統實時監控交易數據等。 本文將詳細介紹如何通過Debezium捕獲數據庫變更事件,并利用Serv…

ADS1299模擬前端(AFE)代替芯片——LHE7909

在現代醫療科技的飛速發展中,精確的生物電勢測量設備變得越來越重要。領慧立芯推出的LHE7909,是一款專為心電圖(ECG)和其他生物電勢測量設計的低噪聲24位模數轉換器(ADC),為醫療設備制造商提供了…

如何實現Redis和Mysql中數據雙寫一致性

一、引言 今天我們來聊聊一個在分布式系統中非常常見但又十分棘手的問題——Redis與MySQL之間的雙寫一致性。我們在項目中多多少少都遇到過類似的困擾,緩存是用Redis,數據庫是用MySQL,但如何確保兩者之間的數據一致性呢?接下來我…

面試篇 - Transformer前饋神經網絡(FFN)使用什么激活函數?

1. FFN結構分解 原始Transformer的FFN層 FFN(x) max(0, xW? b?)W? b? # 原始論文公式 輸入:自注意力層的輸出 x(維度 d_model512) 擴展層:xW? b?(擴展為 d_ff2048) 激活函數:Re…

基于Python Flask的深度學習電影評論情感分析可視化系統(2.0升級版,附源碼)

博主介紹:?IT徐師兄、7年大廠程序員經歷。全網粉絲15W、csdn博客專家、掘金/華為云//InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? 🍅文末獲取源碼聯系🍅 👇🏻 精彩專欄推薦訂閱👇&#x1f3…