当前位置: 首页 > news >正文

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.lryc.cn/news/597860.html

相关文章:

  • 大模型就业方向
  • OpenCV(02)图像颜色处理,灰度化,二值化,仿射变换
  • 【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(3)
  • 解决sparksql创建出来的数据库路径错误的问题
  • VSCode 开发 STM32 - clangd 带来的极致补全体验
  • 13. event.target 和 event.currentTarget 区别
  • 加载用户设置时遇到错误找到一个带有无效“icon“的配置文件。将该配置文件默认为无图标。确保设置“icon“时,该值是图像的有效文件路径“
  • ElasticSearch基础数据查询和管理详解
  • 电商项目_秒杀_压测
  • 多服务器批量发布软件
  • SQL难点突破之复杂业务逻辑的SQL查询实战
  • 力扣刷题(第九十六天)
  • arm64架构开发板上调用奥比中光深度摄像头用于视觉测距
  • 利用DeepSeek编写一个使用lzav算法的文件压缩工具
  • 【JavaSE】正则表达式学习笔记
  • Android Multidex 完全解析:解决64K方法数限制
  • MYSQL笔记4
  • 设备虚拟化
  • 不一样的Mysql安装方式
  • 主要科技公司与新创公司 AI Agent 进展调研
  • 【MySQL】MySQL 索引详解
  • 论文笔记:Tuning Language Models by Proxy
  • HDFS写性能优化技巧详解:从理论到实践
  • 1688 商品数据采集的应用行业与接入方式
  • Linux运维新手的修炼手扎之第24天
  • 本地运行C++版StableDiffusion!开源应用StableVerce发布
  • Java并发编程:锁机制
  • C++(面向对象封装、继承、多态)
  • 深度图像滤波
  • UI测试平台TestComplete:高效覆盖风险,加速持续交付