JVM、Dalvik、ART垃圾回收機制

一、JVM垃圾回收機制(桌面/服務器端)

1.?核心算法:分代收集

  • 新生代回收(Minor GC)

    • 觸發條件:Eden區滿時觸發

    • 算法:復制算法(Eden → Survivor區)

    • 過程:存活對象在Survivor區間復制,年齡+1;年齡超閾值(默認15)晉升老年代

  • 老年代回收(Major GC/Full GC)

    • 觸發條件:老年代空間不足

    • 算法:標記-清除(產生碎片)或標記-整理(無碎片)

    • 耗時:10倍于Minor GC,導致應用暫停(STW)

2.?對象存活判定:可達性分析

  • GC Roots類型

    • 虛擬機棧局部變量

    • 方法區靜態變量與常量

    • JNI引用對象

  • 解決循環引用:不可達對象判定為垃圾(對比引用計數法)

3.?GC觸發場景
GC類型觸發條件影響范圍
Minor GCEden區滿僅新生代
Full GC老年代滿/調用System.gc()全堆+方法區
MetaSpace GC類元數據超限元空間

二、Dalvik垃圾回收機制(Android 4.4及之前)

1.?核心設計:移動端適配
  • 堆結構

    • Zygote堆:預加載系統類(進程間共享)

    • Active堆:應用獨享,對象分配主區域

  • 回收算法:標記-清除(Mark-Sweep)

    • 位圖標記:獨立空間記錄對象狀態,減少對象頭開銷

    • 三次STW

      • 每次暫停約5-10ms,導致界面卡頓

2.?致命缺陷
  • 全堆掃描:每次GC需遍歷所有對象

  • 內存碎片:清除后產生不連續空間,大對象分配失敗

  • 高功耗:頻繁GC增加CPU負載


三、ART垃圾回收機制(Android 5.0+)

1.?革命性優化

2.?核心機制解析
  • 并發標記清除(CMS)

    • 標記階段

      1. 初始標記(STW暫停1次):標記根對象(耗時≤1ms)

      2. 并發標記:與應用線程并行遍歷引用鏈

      3. 最終標記(非STW):處理引用變更(ModUnionTable記錄臟數據)

    • 清除階段:后臺線程異步回收

  • 分代策略增強

    • 年輕代:復制算法(Minor GC <2ms)

    • 老年代:標記-整理(避免碎片)

    • 大對象直存老年代:避免年輕代頻繁回收

3.?GC觸發條件
GC原因觸發場景線程影響
kGcCauseForAlloc分配對象時內存不足STW暫停
kGcCauseBackground后臺并發GC(堆使用達閾值)無STW
kGcCauseExplicit調用System.gc()STW暫停

四、三大運行時GC機制對比

維度JVMDalvikART
堆結構新生代+老年代+元空間Zygote堆+Active堆Image/Zygote/Allocation/Large Object Space
回收算法分代收集(復制+標記整理)標記-清除(全堆掃描)CMS(并發標記+增量清除)
STW暫停Full GC時顯著暫停3次暫停/次GC僅1次初始標記暫停
碎片處理標記整理壓縮無優化(依賴Bionic)在線內存壓縮(ART 10+)
移動端優化寫時復制共享Zygote堆AOT+JIT混合編譯
典型GC耗時Full GC:100ms+每次暫停5-10msMinor GC:<2ms;Full GC:5-10ms

五、面試標準答案(背誦版)

Q:JVM、Dalvik與ART的GC核心區別?

A:?三者本質是不同場景的運行時環境,核心差異如下:

  1. 算法設計

    • JVM:分代收集(新生代復制算法+老年代標記整理)

    • Dalvik:標記-清除(全堆掃描,三次STW卡頓嚴重)

    • ART:并發標記清除(CMS僅1次STW,增量清除減少卡頓)

  2. 堆結構

    • JVM:新生代(Eden+Survivor)+老年代

    • Dalvik:Zygote堆(共享)+Active堆(進程獨享)

    • ART:四空間劃分(Image預加載類+Large Object專存大對象)

  3. 移動端優化

    • Dalvik:寫時復制共享系統類(節省內存)

    • ART:AOT預編譯減少運行時開銷,并發GC降低STW至1次

  4. 性能指標

    • 卡頓:ART(5ms)< Dalvik(30ms)< JVM Full GC(100ms+)

    • 內存利用率:ART > JVM > Dalvik(碎片問題)128

Q:ART如何實現高效GC?

A:?四大關鍵技術:

  1. 并發標記:通過ModUnionTable記錄引用變更,標記階段僅需1次STW

  2. 增量清除:回收過程與應用線程并行

  3. 堆分區:Large Object Space隔離大對象,減少年輕代壓力

  4. AOT預編譯:安裝時生成機器碼,減少運行時解釋開銷

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

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

相關文章

數學專業轉型數據分析競爭力發展報告

一、核心優勢拆解&#xff08;1&#xff09;數學能力與數據分析對應關系數學課程數據分析應用場景比較優勢說明概率論假設檢驗設計能準確判斷統計顯著性閾值實變函數數據質量評估異常值檢測的嚴格性更高線性代數特征工程構建矩陣運算優化模型訓練效率&#xff08;2&#xff09;…

JAVA進階--MySQL

一.MySQL架構連接層:處理客戶端連接服務,認證授權相關的操作服務層:最核心的一層&#xff08;核心服務功能&#xff09;,處理sql,包括sql優化,函數調用....存儲引擎層:存儲引擎是真正負責來操作數據的&#xff08;mysql中數據的存儲和提取&#xff09;, mysql中有不同存儲引擎,…

【架構】Docker簡單認知構建

作為一個之前從來沒有接觸過Docker的倒霉蛋&#xff0c;想了解學習一下Docker 搜了CSDN和RUNOOB&#xff0c;得到的描述如下&#xff1a; Docker 是一個開源的應用容器引擎&#xff0c;基于 Go 語言 并遵從 Apache2.0 協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包…

C++ std::list概念與使用案例

C std::list 概念詳解 std::list 是 C 標準模板庫&#xff08;STL&#xff09;中的一個雙向鏈表容器。與 vector 和 array 不同&#xff0c;它不保證元素在內存中連續存儲&#xff0c;而是通過指針將各個元素連接起來。 核心特性 雙向鏈表結構&#xff1a; 每個元素包含指向前驅…

從0到1學Pandas(六):Pandas 與數據庫交互

目錄一、數據庫基礎操作1.1 連接數據庫1.2 執行 SQL 查詢1.3 創建與修改表結構二、數據導入導出2.1 從數據庫讀取數據2.2 將數據寫入數據庫2.3 大數據量處理三、數據庫事務處理3.1 事務概念與實現3.2 批量數據更新3.3 錯誤處理與回滾四、數據庫性能優化4.1 查詢性能優化4.2 連接…

GitHub 趨勢日報 (2025年07月26日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖602Qwen3-Coder573neko527hrms275BillionMail153Win11Debloat115hyperswitch57data…

機器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim與IsaacLab

目錄 一、前言二、電腦配置三、配置步驟3.1 創建Conda環境3.2 安裝PyTorch3.3 安裝Isaac Sim3.4 安裝Isaac Lab 四、總結 一、前言 博主自從去年開始就一直在關注Isaac Lab和Isaac Sim&#xff0c;但是一直以來由于手頭設備只有4060&#xff0c;甚至沒有達到最低配置16GB顯存要…

DaVinci Resolve 19.0(達芬奇)軟件安裝包下載及詳細安裝教程|附帶安裝文件

[軟件名稱]&#xff1a;ArcGIS [軟件大小]&#xff1a;2.99 GB [系統要求]&#xff1a;支持Win7及更高版本 [下載通道]: 迅雷網盤 [下載鏈接]:高速下載地址 https://pan.xunlei.com/s/VOW9nw-JV99A_7f_5hhpgqO2A1?pwdbufh# ??:先用手機下載迅雷網盤保存到手機中&#xff0c…

Java學習第八十一部分——Shiro

目錄 &#x1f4eb; 一、前言提要簡介 &#x1f6e1;? 二、核心功能介紹 ?? 三、核心架構組件 ? 四、與Java的關系 ?? 五、與Spring Security對比 &#x1f9e9; 六、典型應用場景 &#x1f48e; 七、總結歸納概述 &#x1f4eb; 一、前言提要簡介 Apache Shiro 是…

虛擬機ubuntu20.04共享安裝文件夾

ubuntu20.04共享安裝文件夾 4.5 共享安裝文件夾 將Windows存放安裝文件的文件夾共享給虛擬機&#xff0c;如下圖操作&#xff1a;如果是在ubuntu20.04中&#xff0c;還需要以下的操作&#xff1a; sudo mkdir /mnt/hgfs 此命令無效 sudo echo ‘vmhgfs-fuse /mnt/hgfs fu…

如何查看電腦后門IP和流量?

你是否也有以下經歷&#xff1f;深夜&#xff0c;你的電腦風扇突然狂轉&#xff0c;屏幕卻一片寂靜&#xff1b;每月流量莫名超標&#xff0c;賬單高得離譜&#xff1b;鼠標偶爾不聽使喚…這些可能不是電腦“鬧脾氣”&#xff0c;如何一探究竟&#xff1f; 想象一下&#xff1a…

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測 目錄分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測分類效果基本介紹多策略量子自適應螺旋搜索算法研究摘要1. 引言1.1 研究背景1.2 研究意義1.3 研究目標2. 文…

Android 修改系統時間源碼閱讀

鏈接&#xff1a;XRefAndroid - Support Android 16.0 & OpenHarmony 5.0 (AndroidXRef/AospXRef) 這里看的Android 10的代碼&#xff0c;選中Android 10&#xff0c;勾選所有工程&#xff0c;搜索DateTimeSettings?&#xff1a; 看到showTimePicker應該是顯示一個設置時…

關于自定義域和 GitHub Pages(Windows)

GitHub Pages 支持使用自定義域,或將站點 URL 的根目錄從默認值(例如 )更改為您擁有的任何域,比如octocat.github.io。 誰可以使用此功能? GitHub Pages 在公共存儲庫中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存儲庫中提供 GitHub Pro、GitHub …

自動駕駛領域中的Python機器學習

數據預處理與特征工程 在自動駕駛系統中&#xff0c;數據是驅動決策的核心。從傳感器&#xff08;如攝像頭、激光雷達、毫米波雷達&#xff09;收集的原始數據通常包含噪聲、缺失值和異常值&#xff0c;需要進行系統的預處理。Python的pandas庫提供了強大的數據處理能力&#x…

PROFINET轉CAN通訊協議轉換速通汽車制造

在汽車系統領域之外&#xff0c;控制器局域網&#xff08;CAN&#xff09;總線技術亦廣泛應用于多種工業環境。其固有的穩健性、可靠性與靈活性&#xff0c;使其成為工業自動化及控制系統中設備間通信的理想選擇。CAN 總線技術在工業應用中的關鍵領域包括機器控制、傳感器網絡以…

影刀RPA_小紅書筆記批量采集_源碼解讀

一、項目簡介本項目是一個基于影刀RPA的小紅書筆記批量采集工具&#xff0c;能夠通過兩種模式獲取小紅書平臺的軟文數據&#xff1a;搜索內容抓取和自定義鏈接抓取。工具使用Chrome瀏覽器自動化技術&#xff0c;實現了從網頁數據采集、解析到Excel導出的完整流程。支持獲取筆記…

以使命為帆,結業是重新出發的號角

站在私教班結業典禮的講臺上&#xff0c;望著眼前一張張閃爍著力量的面孔&#xff0c;我心中始終縈繞著一個信念&#xff1a;所有的相遇&#xff0c;都是為了共同奔赴一件更有意義的事。今天不是終點&#xff0c;而是 “使命的啟程”—— 我們因不甘而相聚&#xff1a;不甘心行…

java測試題(下)

1. Spring 核心概念1.1 如何理解 Spring DI&#xff1f;DI&#xff08;依賴注入&#xff09; 是 IoC&#xff08;控制反轉&#xff09; 的具體實現方式&#xff0c;由 Spring 容器在運行時通過以下方式自動注入依賴&#xff1a;構造器注入&#xff08;推薦&#xff09;Setter 注…

LC振蕩Multisim仿真

電路圖&#xff1a;說明&#xff1a;點擊仿真后&#xff0c;先打開S1&#xff0c;可以看到C1的充電曲線。當電容充滿電后&#xff0c;關閉S1&#xff0c;打開S2&#xff0c;這時候&#xff0c;C2電容會快速獲得C1一半的電量。如果沒有L&#xff0c;曲線會變得很陡。如果只加入電…