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

GC Roots 枚舉需要遍歷整個應用程序的上下文,而在進行可達性分析或者垃圾回收時,如果我們還是進行全堆掃描及收集,那么會非常耗時。JVM 將堆分為新生代及老生代,它們的回收頻率及算法不一樣。

1 回收算法

在進行可達性分析時,我們會對對象進行標記:存活及待回收。然后再進行回收。

標記-清除

統一回收所有被標記為“待回收”的對象。

缺陷:1)執行效率不穩定,如果大部分對象需要回收,那清除工作將增加。2)內存空間碎片化,會產生大量不連續的內存碎片。

標記-復制

半區復制,將空間平分為2,每次只用其中1塊,每次回收時將存活的對象復制到另一塊,將當前塊一次性清理掉。

缺陷:1)如果大部分對象是存活的,就會產生很大的內存復制開銷。2)可用內存縮小到原來一半,內存利用率不高。

標記-整理

讓所有存活的對象都向內存空間一端移動,然后直接清理掉邊界以外的內存。

缺陷:如果存活對象分布比較分散,那么移動對象將很耗時。

表 回收算法

“標記-清除”因為“碎片問題”在虛擬機中較少使用,“碎片問題”會帶來垃圾回收頻繁、大型數據無法存儲等問題。

1.1 分代收集

弱分代假說:絕大多數對象都是朝生夕滅。

強分代假說:熬過越多次垃圾收集的對象就越難以消亡。

JVM 按照對象年齡(熬過垃圾收集過程的次數,默認15次)將堆劃分為新生代與老生代。

新生代

依據弱分代假說,每次回收只關注如何保留少部分存活的對象。

算法:標記-復制

老生代

依據強分代假說,以較低頻率回收這個區域。

算法:標記-整理

表 新生代與老生代

1.1.1 新生代 Appel 式垃圾回收

將新生代劃分為三塊空間:Eden、Servivor1、Servivor2,內存大小比例為8:1:1。

每次只使用Eden和一塊Servivor,垃圾回收時,將它們當作還存活的對象一次性復制到另一塊Servivor中,然后清理掉使用的Eden及Servivor塊。

PS:回收時,如果Eden及Servivor存活下來的對象超過Servivor容量時,會將溢出的對象復制到老生代。

1.1.2 晉升到老生代

晉升到老生代有如下場景:

  1. 對象年齡達到閾值。
  2. 大對象(大小超過設定的閾值)直接分配至老生代。避免大對象在新生代頻繁復制。
  3. 老生代空間擔保失敗,Minor GC完成后存活的對象大小超過一塊Servivor的值。
  4. 動態年齡判定,如果年齡小等于X的對象總大小超過Servivor容量的50%,則所有年齡>=X的對象直接晉升。

1.1.3 Minor GC 與 Full GC

緯度

Minor GC

Full GC

作用區域

新生代

整個堆(新生代+老生代)+方法區

觸發

頻率高。

當Eden區空間不足時觸發。

(并非每次Eden滿都觸發,若開啟空間分配擔保,則可能直接觸發Full GC)。

頻率低。

  1. 老生代空間不足。
  2. 方法區空間不足。
  3. 顯式調用:System.gc()
  4. 空間分配擔保失敗。

算法

標記-復制

標記-整理/標記-清除

表 Minor GC 與Full GC的對比

1.2 跨代引用

新生代的對象可能被老生代引用。Minor GC時,進行可達性分析前還需要將引用了新生代對象的老生代對象加入到GC Roots中。

跨代引用假說:跨代引用相對于同代引用來說僅占少數。

1.2.1 卡表

為了能快速收集到引用了新生代的老生代對象,在新生代上建立一個全局的“記憶集”,來記錄老生代中跨代引用的信息。

“卡表”是記憶集的一種實現,是一個字節類型的數組。數組中每個元素對應老生代中一塊固定大小的內存區域。該區域稱為卡頁(默認512字節)。當卡頁中有對象存在跨代引用時,卡表對應數組的元素值為1,否則為0。

1.2.2 卡表的“偽共享”

“偽共享”是一種性能問題。

操作系統中內存與緩存的取值最小單位是緩存行(64字節),多線程并發的場景下,不同線程對不同卡表項修改可能操作的是同一緩存行,從而引發頻繁的緩存同步,降低性能。

優化方案:

  1. 在標記卡表前,如果該條目未被標記,才能進行標記。(減少不必要的寫操作)
  2. 卡表稀疏化,調整卡表條目粒度。

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

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

相關文章

藍橋杯 之 數論

文章目錄 習題質數找素數 數論,就是一些數學問題,藍橋杯十分喜歡考察,常見的數論的問題有:取模,同余,大整數分解,素數,質因數,最大公約數,最小公倍數等等 素…

Unity Shader編程】之渲染流程之深度及pass詳解

關于透明物體的渲染,首先需要了解以下部分 深度緩沖區深度寫入深度測試pass渲染和深度測試的過程深度測試和顏色混合過程 ** 一,深度緩沖區 ** 深度即物體距離相機的距離,深度寫入即是把物體的距離相機信息記錄下來,寫入一個名…

csv文件格式和excel數據格式有什么區別

CSV(Comma-Separated Values)和Excel(XLS/XLSX)數據格式的主要區別如下: 1. 文件格式 CSV:純文本格式,每一行表示一條記錄,字段之間用逗號(,)或其他分隔符&…

Beans模塊之工廠模塊注解模塊@Qualifier

博主介紹:?全網粉絲5W,全棧開發工程師,從事多年軟件開發,在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰,博主也曾寫過優秀論文,查重率極低,在這方面有豐富的經驗…

C# HTTP 文件上傳、下載服務器

程序需要管理員權限,vs需要管理員打開 首次運行需要執行以下命令注冊URL(管理員命令行) netsh advfirewall firewall add rule name"FileShare" dirin actionallow protocolTCP localport8000 ipconfig | findstr "IPv4&quo…

基于 TRIZ 理論的筏式養殖吊籠清洗裝備設計研究

基于 TRIZ 理論的筏式養殖吊籠清洗裝備設計研究 一、引言 筏式養殖在水產養殖業中占據重要地位,吊籠作為養殖貝類、藻類等生物的關鍵器具,其清潔程度直接影響養殖生物的健康與產量。傳統的吊籠清洗方式多依賴人工,效率低下、勞動強度大且清洗…

QA:備份產品的存儲架構采用集中式和分布式的優劣?

分布式和集中式各有優劣,且這兩者下面的存儲類型也都不盡相同,從備份與恢復的數據層面來看,這兩者存儲相結合才是優解。 眾所周知,備份數據只存一份還只放在一個存儲里是不現實的。假設把備份數據訪問頻率、生命周期等參數分為三個…

FPGA中串行執行方式之計數器控制

FPGA中串行執行方式之計數器控制 使用計數器控制的方式實現狀態機是一種簡單且直觀的方法。它通過計數器的值來控制狀態的變化,從而實現順序邏輯。計數器的方式特別適合狀態較少且狀態轉移是固定的場景。 基本原理 計數器控制的狀態機 ?例程1:簡單的順序狀態機 以下是一個…

純vue手寫流程組件

前言 網上有很多的vue的流程組件,但是本人不喜歡很多冗余的代碼,喜歡動手敲代碼;剛開始寫的時候,確實沒法下筆,最后一層一層剝離,總算實現了;大家可以參考我寫的代碼,可以拿過去定制…

數字化轉型驅動衛生用品安全革新

當315晚會上晃動的暗訪鏡頭揭露衛生巾生產車間里漂浮的異物、紙尿褲原料倉中霉變的碎屑時,這一觸目驚心的場景無情地撕開了“貼身安全”的遮羞布,暴露的不僅是部分企業的道德缺失,更凸顯了當前檢測與監管體系的漏洞,為整個行業敲響…

【C++】:異常

目錄 C語言處理錯誤的方式 C異常的概念 C異常的使用 異常的拋出與捕獲匹配原則 函數調用鏈中的棧展開 異常重新拋出 異常安全 異常規范 標準庫異常體系 自定義異常體系 異常的優缺點 C語言處理錯誤的方式 返回值檢查:函數返回特定錯誤碼或值標識失敗&am…

SZU軟件工程大學生涯 2022~2026

用于個人面試前自我介紹,防止忘記或談吐不流利。 面試官您好,我是來自深圳大學計算機與軟件學院的軟件工程專業的王雅賢。在校期間,我修讀了程序設計基礎、面向對象程序設計、數據結構、算法分析與設計、操作系統等核心課程,系統…

【JavaWeb學習Day27】

Tlias前端 員工管理 條件分頁查詢&#xff1a; 頁面布局 搜索欄&#xff1a; <!-- 搜索欄 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…

Linux 系統運行 Android 應用的幾種方案

這幾年&#xff0c;國產操作系統替代正在有條不紊地進行中。但生態是繞不過去的一道坎&#xff0c;指望應用廠商一下子完成國產系統適配也不現實。之前介紹過使用 Wine 運行 Windows 應用的方案&#xff0c;減少了國產系統應用偏少的難題。比如我在辦公室使用最多的企業微信&am…

Python進階教程丨lambda函數

1. lambda函數是什么&#xff1f; 在 Python 里&#xff0c;lambda 函數是一種特殊類型的函數&#xff0c;也被叫做匿名函數。匿名”意味著它不需要像常規函數那樣使用 def 來進行命名。lambda lambda 函數本質上是簡潔的臨時函數 &#xff0c;它適用于只需要簡單邏輯的場景&a…

TK矩陣系統:高效管理與智能化操作平臺

隨著TikTok等社交媒體平臺的快速發展&#xff0c;短視頻創作和內容運營逐漸成為互聯網行業的重要組成部分。為了幫助內容創作者、品牌運營商以及數據分析人員更高效地管理多個TikTok賬號并優化運營策略&#xff0c;TK矩陣系統提供了一種全新的解決方案&#xff0c;結合了先進的…

Spring Boot整合Apache BookKeeper教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot整合Apache BookKeeper教程 1. 簡介 Apache BookKeeper 是一個高性能、持久化的分布式日志存儲系統&#xff0c;適用于需要強一致性和高吞吐量的…

蘋果HFS+56TB存儲MOV文件出錯的恢復方法

HFS文件系統是Apple電腦中默認的最常見的文件系統。HFS來源于UNIX&#xff0c;優勢就是穩定性&#xff0c;另外HFS是支持日志功能的&#xff0c;所以很多存儲設備也采用了HFS文件系統。再穩定的文件系統也有“馬失前蹄”的時候&#xff0c;下面就來聊下HFS出現文件出錯、丟失時…

電源電路篇

電源電路篇 一、LDO-Low Dropout Regulator(低壓差線性穩壓器)1.1 AMS1117-3.3V芯片 二、DCDC-Direct Current to Direct Current(開關穩壓器)2.1 降壓(Buck)電路2.1.1 TPS5450-5V芯片 一、LDO-Low Dropout Regulator(低壓差線性穩壓器) LDO是一種線性穩壓器&#xff0c;用于提…

java項目之在線購物系統(源碼+文檔)

項目簡介 在線購物系統實現了以下功能&#xff1a; 使用在線購物系統的用戶分管理員和用戶兩個角色的權限子模塊。 管理員所能使用的功能主要有&#xff1a;主頁、個人中心、用戶管理、商品分類管理、商品信息管理、系統管理、訂單管理等。 用戶可以實現主頁、個人中心、我的…