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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;曲线会变得很陡。如果只加入电…