第一板块:Android 系统基石与运行原理 | 第三篇:ART 与 Dalvik 运行时环境原理

第一板块:Android 系统基石与运行原理 | 第三篇:ART 与 Dalvik 运行时环境原理

所属板块:第一板块 --- Android 系统基石与运行原理

前置知识:第二篇中的 APK 结构、DEX 文件格式、Linux 进程与内存管理基础

本篇定位 :深入 Android 系统的执行引擎核心。对比分析 Dalvik 与 ART 的架构差异,详解 JIT(即时编译)AOT(预先编译) 的混合编译策略,剖析 DEX、OAT、VDEX 文件格式的二进制结构,以及 ART 的并发标记清除(CMS)垃圾回收机制。全程无性能调优建议、无开发技巧、仅保留虚拟机规范与底层实现原理。


1. 核心结论先行

Android 运行时(Runtime)的核心职责是执行 .dex 字节码管理内存

  • Dalvik :早期 Android 使用的虚拟机,基于 JIT(即时编译),每次应用启动都需要重新编译热点代码,导致启动慢、耗电高。
  • ART :Android 5.0 引入的替代者,核心是 AOT(预先编译)。在安装时将 DEX 编译为本地机器码(OAT),运行时直接执行机器码,速度大幅提升。
  • 现代 ART :Android 7.0+ 演变为 混合模式(AOT + JIT + Profile)。安装时不编译全部代码(加快安装速度),运行时通过 JIT 收集热点代码,空闲时再进行 AOT 编译。

2. 虚拟机演进与架构对比

2.1 Dalvik 与 ART 架构差异

#mermaid-svg-Hl3uS2EnvfpFQXPB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Hl3uS2EnvfpFQXPB .error-icon{fill:#552222;}#mermaid-svg-Hl3uS2EnvfpFQXPB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Hl3uS2EnvfpFQXPB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .marker.cross{stroke:#333333;}#mermaid-svg-Hl3uS2EnvfpFQXPB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Hl3uS2EnvfpFQXPB p{margin:0;}#mermaid-svg-Hl3uS2EnvfpFQXPB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .cluster-label text{fill:#333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .cluster-label span{color:#333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .cluster-label span p{background-color:transparent;}#mermaid-svg-Hl3uS2EnvfpFQXPB .label text,#mermaid-svg-Hl3uS2EnvfpFQXPB span{fill:#333;color:#333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .node rect,#mermaid-svg-Hl3uS2EnvfpFQXPB .node circle,#mermaid-svg-Hl3uS2EnvfpFQXPB .node ellipse,#mermaid-svg-Hl3uS2EnvfpFQXPB .node polygon,#mermaid-svg-Hl3uS2EnvfpFQXPB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Hl3uS2EnvfpFQXPB .rough-node .label text,#mermaid-svg-Hl3uS2EnvfpFQXPB .node .label text,#mermaid-svg-Hl3uS2EnvfpFQXPB .image-shape .label,#mermaid-svg-Hl3uS2EnvfpFQXPB .icon-shape .label{text-anchor:middle;}#mermaid-svg-Hl3uS2EnvfpFQXPB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Hl3uS2EnvfpFQXPB .rough-node .label,#mermaid-svg-Hl3uS2EnvfpFQXPB .node .label,#mermaid-svg-Hl3uS2EnvfpFQXPB .image-shape .label,#mermaid-svg-Hl3uS2EnvfpFQXPB .icon-shape .label{text-align:center;}#mermaid-svg-Hl3uS2EnvfpFQXPB .node.clickable{cursor:pointer;}#mermaid-svg-Hl3uS2EnvfpFQXPB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .arrowheadPath{fill:#333333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Hl3uS2EnvfpFQXPB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Hl3uS2EnvfpFQXPB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Hl3uS2EnvfpFQXPB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Hl3uS2EnvfpFQXPB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Hl3uS2EnvfpFQXPB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Hl3uS2EnvfpFQXPB .cluster text{fill:#333;}#mermaid-svg-Hl3uS2EnvfpFQXPB .cluster span{color:#333;}#mermaid-svg-Hl3uS2EnvfpFQXPB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Hl3uS2EnvfpFQXPB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Hl3uS2EnvfpFQXPB rect.text{fill:none;stroke-width:0;}#mermaid-svg-Hl3uS2EnvfpFQXPB .icon-shape,#mermaid-svg-Hl3uS2EnvfpFQXPB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Hl3uS2EnvfpFQXPB .icon-shape p,#mermaid-svg-Hl3uS2EnvfpFQXPB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Hl3uS2EnvfpFQXPB .icon-shape .label rect,#mermaid-svg-Hl3uS2EnvfpFQXPB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Hl3uS2EnvfpFQXPB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Hl3uS2EnvfpFQXPB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Hl3uS2EnvfpFQXPB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 现代 ART (Android 7.0+)
初次运行
记录 Profile
空闲/充电时
更新
.dex 字节码
解释器 / JIT
热点代码记录
dex2oat (后台优化)
OAT 文件
ART 时代 (Android 5.0+)
安装时
生成
mmap 映射
.dex 字节码
dex2oat 工具
OAT 文件 (ELF 机器码)
直接执行机器码
Dalvik 时代 (Android 4.4 及以前)
解释执行
运行时热点
缓存
.dex 字节码
解释器 (Interpreter)
JIT 编译器
Code Cache (机器码)

2.2 核心差异对比表

维度 Dalvik ART (早期) ART (现代混合)
编译时机 运行时 (Runtime) 安装时 (Install Time) 运行时 + 空闲时
编译方式 JIT (解释 + 热点编译) AOT (全量编译) JIT + AOT + Profile
执行文件 .dex (解释执行) .oat (机器码) .oat / .vdex
启动速度 慢 (每次编译) 快 (直接执行)
存储空间 大 (机器码体积大) 中等
系统更新 慢 (需重新编译所有 App)

3. 编译工具链:dex2oat

dex2oat 是 ART 的核心工具,负责将 DEX 文件转换为 OAT 文件。

3.1 dex2oat 工作流程

#mermaid-svg-5aKGrg8g4qc2KGrn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5aKGrg8g4qc2KGrn .error-icon{fill:#552222;}#mermaid-svg-5aKGrg8g4qc2KGrn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5aKGrg8g4qc2KGrn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5aKGrg8g4qc2KGrn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5aKGrg8g4qc2KGrn .marker.cross{stroke:#333333;}#mermaid-svg-5aKGrg8g4qc2KGrn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5aKGrg8g4qc2KGrn p{margin:0;}#mermaid-svg-5aKGrg8g4qc2KGrn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5aKGrg8g4qc2KGrn .cluster-label text{fill:#333;}#mermaid-svg-5aKGrg8g4qc2KGrn .cluster-label span{color:#333;}#mermaid-svg-5aKGrg8g4qc2KGrn .cluster-label span p{background-color:transparent;}#mermaid-svg-5aKGrg8g4qc2KGrn .label text,#mermaid-svg-5aKGrg8g4qc2KGrn span{fill:#333;color:#333;}#mermaid-svg-5aKGrg8g4qc2KGrn .node rect,#mermaid-svg-5aKGrg8g4qc2KGrn .node circle,#mermaid-svg-5aKGrg8g4qc2KGrn .node ellipse,#mermaid-svg-5aKGrg8g4qc2KGrn .node polygon,#mermaid-svg-5aKGrg8g4qc2KGrn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5aKGrg8g4qc2KGrn .rough-node .label text,#mermaid-svg-5aKGrg8g4qc2KGrn .node .label text,#mermaid-svg-5aKGrg8g4qc2KGrn .image-shape .label,#mermaid-svg-5aKGrg8g4qc2KGrn .icon-shape .label{text-anchor:middle;}#mermaid-svg-5aKGrg8g4qc2KGrn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5aKGrg8g4qc2KGrn .rough-node .label,#mermaid-svg-5aKGrg8g4qc2KGrn .node .label,#mermaid-svg-5aKGrg8g4qc2KGrn .image-shape .label,#mermaid-svg-5aKGrg8g4qc2KGrn .icon-shape .label{text-align:center;}#mermaid-svg-5aKGrg8g4qc2KGrn .node.clickable{cursor:pointer;}#mermaid-svg-5aKGrg8g4qc2KGrn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5aKGrg8g4qc2KGrn .arrowheadPath{fill:#333333;}#mermaid-svg-5aKGrg8g4qc2KGrn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5aKGrg8g4qc2KGrn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5aKGrg8g4qc2KGrn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5aKGrg8g4qc2KGrn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5aKGrg8g4qc2KGrn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5aKGrg8g4qc2KGrn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5aKGrg8g4qc2KGrn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5aKGrg8g4qc2KGrn .cluster text{fill:#333;}#mermaid-svg-5aKGrg8g4qc2KGrn .cluster span{color:#333;}#mermaid-svg-5aKGrg8g4qc2KGrn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5aKGrg8g4qc2KGrn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5aKGrg8g4qc2KGrn rect.text{fill:none;stroke-width:0;}#mermaid-svg-5aKGrg8g4qc2KGrn .icon-shape,#mermaid-svg-5aKGrg8g4qc2KGrn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5aKGrg8g4qc2KGrn .icon-shape p,#mermaid-svg-5aKGrg8g4qc2KGrn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5aKGrg8g4qc2KGrn .icon-shape .label rect,#mermaid-svg-5aKGrg8g4qc2KGrn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5aKGrg8g4qc2KGrn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5aKGrg8g4qc2KGrn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5aKGrg8g4qc2KGrn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入
前端
中端
后端
输出
输出
输出
.dex / .apk
dex2oat 进程
解析 DEX
优化 (内联/去虚化)
生成机器码
.oat 文件 (ELF)
.vdex 文件
.art 文件

3.2 输出产物详解

dex2oat 编译后通常会在 /data/dalvik-cache/ 下生成三个文件:

文件后缀 全称 学术定义
.oat Optimized ART File ELF 格式的可执行文件。包含编译后的本地机器码、字符串表、符号表。这是真正被执行的东西。
.vdex Verified DEX 验证过的 DEX 缓存。存储 DEX 文件的快速验证信息,避免下次安装或开机时重复验证 DEX 合法性。
.art ART Image 预加载镜像。包含启动时常用类的预初始化对象,加快冷启动速度。

4. DEX 与 OAT 文件格式(二进制结构)

为了理解 ART 如何工作,必须了解这两种核心文件的结构。此处采用纯文本树状图展示。

4.1 DEX 文件结构(未编译)

复制代码
classes.dex
├── Header (头部)
│   ├── Magic (DEX 魔数: 64 65 78 0A 30 33 35 00)
│   ├── Checksum (校验和)
│   └── File Size (文件大小)
├── String Table (字符串索引表)
├── Type Table (类型索引表)
├── Proto Table (方法原型索引表)
├── Field Table (字段索引表)
├── Method Table (方法索引表)
├── Class Definition (类定义)
├── Data Section (数据区: 代码指令、常量池)
└── Link Data (链接数据)

4.2 OAT 文件结构(已编译)

复制代码
base.oat (ELF Format)
├── ELF Header (ELF 头)
├── Program Headers (程序头)
├── Section Headers (节区头)
├── .text (代码段)
│   ├── Compiled Code (编译后的 ARM/x86 机器指令)
│   └── JNI Stubs (JNI 调用桩)
├── .rodata (只读数据段)
│   ├── String Literals (字符串字面量)
│   └── Type Info (类型信息)
├── .bss (未初始化数据段)
├── OatHeader (OAT 专有头)
│   ├── DEX File Count (包含的 DEX 数量)
│   └── Instruction Set (指令集: arm64, x86_64...)
└── OatDexFile (OAT 中的 DEX 映射)

5. ART 垃圾回收机制(GC)

ART 使用多种 GC 算法组合,以适应不同的内存场景。

5.1 GC 类型对比

GC 类型 触发条件 算法 特点
Concurrent Mark Sweep (CMS) 内存不足、后台 标记-清除 主 GC。大部分工作与应用线程并发执行,停顿短。
Semi-Space 内存极度紧张 复制算法 将存活对象从一个空间复制到另一个空间。停顿较长,但碎片少。
Generational 年轻代对象 分代收集 基于弱分代假说(大部分对象朝生夕死)。只清理年轻代,速度快。

5.2 CMS 并发标记清除流程

#mermaid-svg-Ktapt6BdNCr3tT8K{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ktapt6BdNCr3tT8K .error-icon{fill:#552222;}#mermaid-svg-Ktapt6BdNCr3tT8K .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ktapt6BdNCr3tT8K .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ktapt6BdNCr3tT8K .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ktapt6BdNCr3tT8K .marker.cross{stroke:#333333;}#mermaid-svg-Ktapt6BdNCr3tT8K svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ktapt6BdNCr3tT8K p{margin:0;}#mermaid-svg-Ktapt6BdNCr3tT8K defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-Ktapt6BdNCr3tT8K g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-Ktapt6BdNCr3tT8K g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-Ktapt6BdNCr3tT8K g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-Ktapt6BdNCr3tT8K g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-Ktapt6BdNCr3tT8K g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-Ktapt6BdNCr3tT8K .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-Ktapt6BdNCr3tT8K .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-Ktapt6BdNCr3tT8K .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-Ktapt6BdNCr3tT8K .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Ktapt6BdNCr3tT8K .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-Ktapt6BdNCr3tT8K .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-Ktapt6BdNCr3tT8K .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-Ktapt6BdNCr3tT8K .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ktapt6BdNCr3tT8K .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ktapt6BdNCr3tT8K .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ktapt6BdNCr3tT8K .edgeLabel .label text{fill:#333;}#mermaid-svg-Ktapt6BdNCr3tT8K .label div .edgeLabel{color:#333;}#mermaid-svg-Ktapt6BdNCr3tT8K .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-Ktapt6BdNCr3tT8K .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-Ktapt6BdNCr3tT8K .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-Ktapt6BdNCr3tT8K .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-Ktapt6BdNCr3tT8K .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-Ktapt6BdNCr3tT8K .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ktapt6BdNCr3tT8K .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ktapt6BdNCr3tT8K #statediagram-barbEnd{fill:#333333;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ktapt6BdNCr3tT8K .cluster-label,#mermaid-svg-Ktapt6BdNCr3tT8K .nodeLabel{color:#131300;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-Ktapt6BdNCr3tT8K .note-edge{stroke-dasharray:5;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-note text{fill:black;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram-note .nodeLabel{color:black;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagram .edgeLabel{color:red;}#mermaid-svg-Ktapt6BdNCr3tT8K #dependencyStart,#mermaid-svg-Ktapt6BdNCr3tT8K #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-Ktapt6BdNCr3tT8K .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ktapt6BdNCr3tT8K :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 空闲
触发 GC (Allocation Failure)
2. 并发标记 (与应用线程一起跑) 3. 重新标记 (Stop The World 短暂停顿) 4. 并发清除 (回收垃圾) 5. 完成 Idle

  1. 标记 Roots (栈/寄存器/全局变量) ConcurrentMark
    ReMark
    ConcurrentSweep

学术定义

  • Stop The World (STW):暂停所有 Java 线程,确保内存快照一致性。ART 极力缩短 STW 时间。
  • Card Table:一种标记位图,用于记录老年代对新生代的引用,避免全堆扫描。

6. 内存布局与对象模型

6.1 对象内存布局

在 ART 中,一个 Java 对象在内存中的布局如下:

复制代码
Object Header (对象头)
├── Mark Word (8/16 bytes): 哈希码、锁状态、GC 标志
├── Class Pointer (4/8 bytes): 指向 Class 对象的指针
└── Array Length (4 bytes): 如果是数组,存储长度
Instance Data (实例数据)
├── int a (4 bytes)
├── boolean b (1 byte, 对齐填充)
└── Object ref (4/8 bytes)
Padding (对齐填充)
└── 补足 8 字节倍数

7. 本篇总结(知识闭环)

关键点 纯学术定义
ART 的本质 一个基于 AOT 编译的托管运行时环境,取代了基于解释执行的 Dalvik。
OAT 的本质 包含 DEX 字节码及其对应本地机器码的 ELF 可执行文件。
混合编译 为了解决 AOT 安装慢和占用空间大的问题,引入 JIT 收集 Profile,后台进行 AOT。
GC 核心 CMS (并发标记清除) 为主,辅以分代收集,最大限度减少 Stop The World 时间。

下一篇预告第一板块:Android 系统基石与运行原理 | 第四篇:进程孵化(Zygote)与 Low Memory Killer 机制

相关推荐
私人珍藏库2 小时前
【Android】Wallcraft 3.62.0-最强4 K壁纸软件-解锁高级版
android·智能手机·app·工具·软件·多功能
GesLuck2 小时前
Node-RED企业微信发送—群文件
android·java·企业微信
whatever who cares2 小时前
android中fragment demo举例
android·java·开发语言
zhangphil2 小时前
Android将ImageView显示的图原样取出转换为Bitmap,Kotlin
android·kotlin
plainGeekDev3 小时前
CountDownTimer → Flow
android·java·kotlin
仙俊红3 小时前
如何优化 MySQL 深分页 SQL
android·sql·mysql
awu的Android笔记3 小时前
网络闪断 + DNS 故障:Android弱网模拟中最容易被忽视的两个场景
android·tcp/ip
Flynt4 小时前
Android 17内存限制:我是怎么发现App被系统悄悄干掉的
android·性能优化
消失的旧时光-19434 小时前
Kotlin 协程设计思想(七):为什么 Kotlin 要设计 SupervisorJob 和 supervisorScope?
android·开发语言·kotlin