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

JVM、Dalvik、ART区别

一、核心架构差异

1. 指令集架构

  • JVM:基于栈结构,所有操作(如加法、方法调用)通过操作数栈完成。

    • 特点:指令短小紧凑,但需频繁内存交互(如iloadistore),执行效率低。

  • Dalvik/ART:基于寄存器架构,直接操作虚拟寄存器。

    • 特点:单条指令完成复杂操作(如add-int/2addr v1, v2),减少指令分派次数,适合移动设备。

2. 字节码与文件格式
特性JVM(.class)Dalvik/ART(.dex)
文件结构每个类独立.class文件多类合并为单一.dex文件
冗余处理常量池按类独立,冗余高全局共享常量池,去重优化
体积效率较大(如Google+ APK大4倍)减少75%体积,I/O效率高1

✅ 关键概念解释

  • Dex文件:由dx工具合并.class文件生成,去除重复字符串/符号,提升类加载速度。

  • Odex文件:优化后的Dex,包含目标平台特定指令(Dalvik)或预编译机器码(ART)。


二、执行机制对比

1. 编译方式与性能

  • Dalvik (JIT)

    • 运行时动态编译热点代码,缓存机器码。

    • 缺点:每次启动需重新编译,CPU占用高导致耗电26。

  • ART (AOT+JIT)

    • AOT:安装时预编译整个Dex为本地机器码(.oat文件)。

    • JIT(Android 7.0+):运行时记录热点代码,空闲时编译(混合模式平衡安装时间与运行效率)。

2. 性能指标对比
维度JVMDalvikART
启动速度中等慢(需JIT)快(直接执行)
内存占用高(栈操作)中等低(预编译优化)
存储开销高(+10%~20%)

三、内存管理与GC优化

1. 垃圾回收机制
  • JVM

    • 标记-清除(Mark-Sweep)、分代收集(G1)。

    • 停顿时间长,不适合实时系统。

  • Dalvik

    • 分Zygote堆(预加载核心类)和Active堆(应用对象)。

    • GC频繁(尤其低内存设备),引发界面卡顿。

  • ART

    • 并发标记-清除(Concurrent Mark-Sweep):GC暂停时间减少60%。

    • 分代收集:优先回收短命对象,提升吞吐量。

2. 堆管理创新
  • 写时复制(Copy-on-Write)

    • Zygote进程fork子进程时共享预加载类,减少内存复制。

  • 位图标记(Bitmap Marking)

    • GC时单独申请位图空间标记对象,避免对象头开销。


四、设计目标与生态定位

1. JVM:跨平台优先
  • 核心目标:”一次编译,到处运行“(依赖各平台JVM实现)。

  • 代价:牺牲性能换取兼容性(如x86/ARM均需适配)。

2. Dalvik/ART:移动端优化
  • 嵌入式适配

    • 低内存:多进程隔离(每个App独立Linux进程)。

    • 低功耗:AOT减少CPU持续负载。

  • 系统集成

    • Zygote预加载核心类,加速应用启动。

    • Binder IPC替代传统Socket通信。


五、高频概念详解

  1. JIT(Just-In-Time)

    • 运行时动态编译热点代码(如多次调用的方法)。

    • 典型问题:”为何Dalvik的JIT耗电?“ → 持续编译增加CPU负载。

  2. AOT(Ahead-Of-Time)

    • 安装时预编译字节码→机器码,空间换时间。

    • 典型问题:”ART安装慢的原因?“ → 编译占用额外时间。

  3. Dex vs Class

    • Dex合并多个Class,全局常量池共享(如字符串”Landroid/content/Context;“仅存一份)。

  4. Zygote机制

    • 系统启动时预加载核心类,fork应用进程时直接共享只读内存,加速启动。


六、常见问题

Q:Dalvik、ART与JVM的核心区别是什么?
A: 三者本质是不同生态的运行时环境,核心区别如下:

  1. 架构设计

    • JVM:栈架构,执行.class文件,指令紧凑但效率低。

    • Dalvik/ART:寄存器架构,执行.dex文件,指令少且执行快。

  2. 编译方式

    • JVM:JIT运行时编译,热点代码动态优化。

    • Dalvik:JIT运行时编译,启动慢但安装快。

    • ART:AOT预编译+JIT辅助(Android 7.0+),安装时生成机器码,运行效率最高。

  3. 内存模型

    • JVM:传统堆管理,GC停顿长。

    • Dalvik:分Zygote/Active堆,GC频繁引发卡顿。

    • ART:并发标记GC+分代收集,停顿减少60%。

  4. 生态定位

    • JVM:跨平台通用(服务器/桌面)。

    • Dalvik/ART:为嵌入式优化(低内存/低功耗)。

Q:为何ART比Dalvik快?
A: 两大关键优化:

  1. AOT预编译:省去运行时解释/编译开销(直接执行机器码)。

  2. GC改进:并发标记减少停顿,分代回收提升吞吐量。
    代价:存储空间增加10%~20%(典型空间换时间)

http://www.xdnf.cn/news/16106.html

相关文章:

  • JVM、Dalvik、ART垃圾回收机制
  • 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——核心技术篇(二)类的高级特性