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

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.xdnf.cn/news/16105.html

相关文章:

  • 1.1 Deep learning?pytorch ?深度学习训练出来的模型通常有效但无法解释合理性? 如何 解释?
  • 「iOS」——KVC
  • QT的moveToThread 用法
  • GaussDB null的用法
  • 深入浅出理解 Reactor:响应式编程的利器​
  • 为什么IMU是无人机稳定控制的的核心?
  • LNMP-zblog分布式部署
  • 华为高频算法题:最长连续递增子序列(Longest Continuous Increasing Subsequence)
  • AI黑科技:GAN如何生成逼真人脸
  • vector【上】
  • 大模型就业方向
  • Log4j CVE-2021-44228 漏洞复现详细教程
  • 【lucene】实现knn
  • Git 完全手册:从入门到团队协作实战(4)
  • DP系列2【01背包】洛谷 P1049 [NOIP 2001 普及组] 装箱问题题解
  • 构建高性能推荐系统:MixerService架构解析与核心实现
  • K8s:离线部署Kubernetes1.26.12及采用外部Harbor
  • .net core接收对方传递的body体里的json并反序列化
  • P5535 【XR-3】小道消息
  • 【MyBatis-Plus】核心开发指南:高效CRUD与进阶实践
  • 83、设置有人DTU设备USR-M100采集传感器数据,然后上传阿里云服务
  • 【音视频学习】五、深入解析视频技术中的像素格式:颜色空间、位深度、存储布局
  • CodeBuddy IDE实战:用AI全栈能力快速搭建课程表网页
  • 借助Aspose.HTML控件,使用 Python 编程将网页转换为 PDF
  • Object Sense (OSE):一款从编辑器脚本发展起来的编程语言
  • 优化:Toc小程序猜你喜欢功能
  • Java 堆(优先级队列)
  • AI 及开发领域动态与资源汇总(2025年7月23日)
  • 编程语言Java——核心技术篇(二)类的高级特性
  • 逆向入门(41)程序逆向篇-crackme