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

Dalvik虚拟机、ART虚拟机与JVM的核心区别

一、架构设计差异
  1. ​指令集架构​

    • ​JVM​​:基于​​栈结构​​,所有操作(如算术运算、方法调用)均依赖操作数栈完成,指令集紧凑但执行效率较低(需频繁内存交互)。
    • ​Dalvik​​:基于​​寄存器架构​​,直接操作虚拟寄存器,指令更少且执行速度更快(如add-int/2addr一条指令即可完成加法)。
    • ​ART​​:继承Dalvik的寄存器架构,但通过​​AOT预编译​​直接将字节码转为机器码,避免运行时解释或JIT编译。
  2. ​字节码格式​

    • ​JVM​​:执行.class文件,每个类独立编译,存在冗余信息(如重复字符串常量)。
    • ​Dalvik/ART​​:使用.dex文件,合并多个.class文件并去除冗余,体积更小(如Google+ APK代码体积减少75%),且支持跨类共享常量池。
二、执行机制对比
​特性​​JVM​​Dalvik​​ART​
​编译方式​JIT(运行时编译)JIT(运行时编译)​AOT(安装时预编译)​​ + JIT(热代码优化)
​启动速度​中等(需加载类库)​慢​​(首次需JIT编译)​快​​(直接执行机器码)
​内存占用​高(栈操作频繁)中等(寄存器优化)低(预编译减少临时对象)
​存储开销​低(.class文件)低(.dex压缩优化)​高​​(预编译机器码增加10%-20%存储)
三、内存管理与垃圾回收(GC)
  1. ​JVM​

    • ​GC算法​​:标记-清除(Mark-Sweep)、分代收集(如G1),停顿时间较长。
    • ​堆管理​​:每个对象头部存储GC标记,内存碎片化较严重。
  2. ​Dalvik​

    • ​GC机制​​:采用Mark-Sweep,​​频繁触发GC​​(尤其低内存设备),导致界面卡顿。
    • ​堆分区​​:分为Zygote堆(预加载核心类)和Active堆(应用对象),通过写时复制(Copy-on-Write)优化进程创建。
  3. ​ART​

    • ​GC优化​​:引入​​并发标记-清除​​(Concurrent Mark-Sweep),减少停顿时间;支持分代GC,提升回收效率。
    • ​内存分配​​:采用RosAlloc、BumpPointer等算法,减少碎片化并提升分配速度。
四、性能与适用场景
  1. ​计算密集型任务​

    • ​JVM​​:通用性强,但效率低于寄存器架构(如ARM设备上浮点运算性能差)。
    • ​Dalvik​​:JIT动态优化热代码,但运行时编译开销大(如游戏场景CPU占用率高)。
    • ​ART​​:AOT预编译+JIT混合模式,复杂计算流畅(如3D渲染帧率提升30%)。
  2. ​多进程与资源隔离​

    • ​JVM​​:单进程多线程,依赖操作系统线程调度。
    • ​Dalvik/ART​​:​​每应用独立进程​​,通过Linux进程隔离保障安全性(如崩溃不影响其他应用)。
五、设计目标与生态定位
  1. ​JVM​​:

    • ​跨平台核心​​:实现“一次编译,到处运行”,依赖不同平台的JVM实现(如Windows JDK与Linux JDK)。
    • ​通用性优先​​:牺牲部分性能换取广泛的硬件兼容性。
  2. ​Dalvik/ART​​:

    • ​移动端优化​​:针对ARM架构和低功耗设备设计,强调能效比(如ART的AOT编译降低CPU持续负载)。
    • ​系统集成​​:深度整合Android特性(如Zygote进程预加载、Binder IPC),提升启动速度和响应能力。

总结

  • ​Dalvik vs JVM​​:寄存器架构与栈架构的本质差异导致Dalvik在移动端更高效,但JVM的跨平台能力不可替代。
  • ​ART vs Dalvik​​:AOT预编译彻底解决JIT的运行时开销,但牺牲存储空间换取性能飞跃。
  • ​适用场景​​:
    • JVM适合服务器和桌面应用,Dalvik/ART专为Android移动生态优化。
    • ART的混合编译模式(AOT+JIT)平衡了安装时间与运行效率,成为Android 5.0+的性能基石。

相关文章:

Dalvik虚拟机、ART虚拟机与JVM的核心区别

一、架构设计差异 ​​指令集架构​​ ​​JVM​​:基于​​栈结构​​,所有操作(如算术运算、方法调用)均依赖操作数栈完成,指令集紧凑但执行效率较低(需频繁内存交互)。​​Dalvik​​&#x…...

Unity 3D AssetBundle加密解密教程

前言 在Unity中加密和解密AssetBundle可以保护你的资源不被未经授权的访问或篡改。以下是详细的步骤和示例代码: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀! 1. 加密AssetBundle 步骤&…...

【Linux】shell脚本的常用命令

目录 简介 一.设置主机名称 1.1通过文件修改 1.2通过命令修改 二.网络管理命令nmcli 2.1查看网卡 2.2设置网卡 三.简单处理字符 3.1seq打印连续字符 3.2printf,echo打印字符 3.3sort排序 3.4uniq冗余处理 3.5cut对字符的截取 四.xargs输入转参 简介 以下命令都是…...

Netty应用:从零搭建Java游戏服务器网络框架

在游戏开发领域,服务器网络框架是连接玩家与游戏世界的桥梁,其稳定性和高效性直接影响玩家的游戏体验。本文将详细介绍如何使用Java语言和Netty框架,搭建一个兼具TCP和UDP协议支持的游戏服务器网络框架,并配套开发客户端,助你快速掌握游戏网络开发的核心技术。 1.项目概览…...

Pycharm and Flask 的学习心得(9)

request对象: 1. request包含前端发送过来的所有请求数据 将from表单里的内容CV到request里面,可以添加if语句来做判断出请求类型后的操作 在网页上的表单上input的数据,后端如何获取呢? request对象获取前端发送来的数据 // …...

Linux初始-环境安装(2)

文章目录 安装问题(1-1.51.39)xshell的下载和登录步骤xshell创建多用户与删除用户xshell免密码登录 简介:这篇文章我认为对于初学Linux还是非常重要的,正所谓磨刀不误砍柴工,工具环境准备好了,后面的学习才…...

Nginx 安全防护与 HTTPS 部署实战笔记

Nginx 安全防护与 HTTPS 部署实战笔记 一、核心安全配置 (一)编译安装 Nginx 安装支持软件 dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar作用:安装 Nginx 编译所需的开发包&#…...

Python Day34 学习

今日内容 通过“心脏病数据集”对之前的内容进行复习,再进行新内容“元组和OS模块”的学习。 机器学习模型建模和评估(先不考虑调参) 基于之前已经预处理过的心脏病数据集 划分数据值 模型训练与模型评估 # 随机森林 rf_model RandomFo…...

【ASR】基于分块非自回归模型的流式端到端语音识别

论文地址:https://arxiv.org/abs/2107.09428 摘要 非自回归 (NAR) 模型在语音处理中越来越受到关注。 凭借最新的基于注意力的自动语音识别 (ASR) 结构,与自回归 (AR) 模型相比,NAR 可以在仅精度略有下降的情况下实现有前景的实时因子 (RTF) 提升。 然而,识别推理需要等待…...

国芯思辰|国产FRAM SF25C128助力监控系统高效低功耗解决方案,对标MB85RS128/FM25V01

监控系统已成为保障公共安全、维护社会秩序的重要工具。随着监控系统的不断发展,对数据存储的要求也越来越高,不仅需要大容量、高速度的存储设备,还要求其具备高可靠性和低功耗等特性。国产铁电存储器 SF25C128作为一种新型非易失性存储器&am…...

攻防世界逆向刷题笔记(新手模式9-1?)

bad_python 看样子是pyc文件损坏了。利用工具打开,发现是MAGIC坏了。搜下也没有头绪。 攻防世界-难度1- bad_python - _rainyday - 博客园 python Magic Number对照表以及pyc修复方法 - iPlayForSG - 博客园 看WP才知道36已经提示了pyc版本了。参考第二个文章&am…...

【golang】能否在遍历map的同时删除元素

Go 团队在设计时确实允许在迭代时删除当前元素,但是不建议直接使用 for k, v : range m 删除。对于单线程读写情况: 主要原因如下: 1. 迭代变量重用问题 Go 的 range 循环会重用迭代变量的内存地址。当你使用 for k, v : range m 时&#xf…...

制作一款打飞机游戏58:子弹模式组合

今天我们将继续深入探讨子弹模式系统,并在我们的模式编辑器上做一些收尾工作。 子弹模式系统的乐趣 首先,我想说,这个子弹模式系统真的非常有趣。看着屏幕上不断喷射的子弹,感觉真是太棒了! 合并修饰符 今天&#…...

使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!

在应用开发领域,JSON/XML数据结构因其灵活性和通用性,成为开发者存储和交换数据的首选。然而,传统管理工具在处理这些半结构化数据时,往往存在可视化效果差、编辑效率低等问题,严重影响开发者的工作效率。 现在&#…...

Qt基础:数据容器类

数据容器类 1. QList1.1 使用创建和初始化添加和删除元素访问和修改元素查找和判断元素遍历列表排序和筛选与其他容器的转换 1.2 完整示例 1. QList 在Qt中,QList 是一个动态数组容器类,用于存储和管理相同类型的元素。它提供了快速随机访问、动态扩展和…...

Vue3监听对象数组属性变化方法

在Vue3中,监听对象数组中某个属性的变化可以通过以下几种方法实现: 方法一:深度监听整个数组并比较属性变化 使用 watch 函数并启用 deep: true,在回调中遍历比较新旧数组的特定属性。 javascript 复制 下载 import { ref, …...

深入了解PyTorch:起源、优势、发展与安装指南

深入了解PyTorch:起源、优势、发展与安装指南 目录 引言PyTorch简介PyTorch的优势 动态计算图直观易用的API强大的社区支持丰富的生态系统高性能与可扩展性 PyTorch的发展历程PyTorch的主要组件 Torch.TensorAutograd自动求导nn模块TorchvisionTorchText和TorchAu…...

DeepSeek智能对话助手项目

目录: 1、效果图2、实现代码3、温度和TopK的作用对比 1、效果图 2、实现代码 # import gradio as gr# def reverse_text(text): # return text[::-1]# demogr.Interface(fnreverse_text,inputs"text",outputs"text")# demo.launch(share&q…...

浅谈Mysql的MVCC机制(RC与RR隔离级别)

MVCC(Multi-Version Concurrency Control)多版本并发控制 说这个我们先来了解一下Mysql的隔离级别,因为MVCC和Mysql的隔离级别是有关的。 Mysql默认的隔离级别是RR(可重复读) 其他的隔离级别是读未提交(…...

uniapp-商城-72-shop(5-商品列表,购物车实现回顾)

我们通过前面的章节已经将数据添加到了购物车,但实际上购物车的处理还有很多东西需要完成。 我们看看如何将商品添加到购物车。 本文介绍了购物车功能的实现方式,重点讲解了如何将商品添加到购物车以及购物车状态管理的处理机制。主要内容包括:1. 通过Vuex管理购物车状态,包…...

【git】 pull + rebase 或 pull + merge什么区别?

在Git中,pull + rebase 和 pull + merge 是两种整合远程分支更新的方式,其核心区别在于如何处理提交历史。以下是详细对比: 核心区别 操作提交历史结构合并方式冲突处理适用场景pull + merge保留分支分叉和合并节点创建新的合并提交(Merge Commit)一次性解决所有冲突公共…...

1. 编程语言进化史与JavaScript

引言 作为一名开发者,理解编程语言的演进历史和核心特性是至关重要的。接下来将从编程语言的三个历史阶段入手,重点解析JavaScript的起源、特性及其与相关技术的关系,同时补充进制转换的基础知识,为初学者构建完整的知识体系。 一、编程语言的三大历史阶段 1. 机器语言(…...

Vue3 中 Axios 深度整合指南:从基础到高级实践引言

在现代前端开发中,与后端API的交互是构建动态应用的核心环节。Axios作为最流行的HTTP客户端之一,以其简洁的API和强大的功能在前端生态中占据重要地位。本文将全面探讨如何在Vue3项目中高效整合Axios,从基础配置到高级封装,从性能…...

MySQL#Select语句执行过程

服务端程序架构 MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序mysqld。 Select语句执行过程 连接层 客户端和服务器端建立连接,客户端发送 SQL 至服务器端 SQL层 SQL语句处理 查询缓存: 缓存命中该SQL执行结果直…...

hbuilder中h5转为小程序提交发布审核

【注意】 [HBuilder] 11:59:15.179 此应用 DCloud appid 为 __UNI__9F9CC77 ,您不是这个应用的项目成员。1、联系这个应用的所有者,请求加入项目成员(https://dev.dcloud.net.cn "成员管理"-"添加项目成员")…...

文档注释:删还是不删

问题:代码中存在大量的文档注释,占用大量篇幅,一次难以看完整个文件,于是诞生了一个想法:删除所有文档注释,于是问了下 DeepWiki 文档注释对tree - sitter有影响吗?文档注释对Roocode大模型理解…...

【数据结构】单链表练习

1.链表的中间节点 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 用快慢指针来解决 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* he…...

JVM 性能优化终极指南:全版本兼容、参数公式与场景实战

一、引言 JVM 优化的核心难点在于版本兼容性与场景适配性。从 Java 8 到 Java 21,JVM 的内存模型、GC 策略和默认参数发生了巨大变化;从高并发 Web 到大数据批处理,不同业务场景对延迟、吞吐量的要求也截然不同。本文基于历史会话中用户关注…...

分布式爬虫监控架构设计

1. 监控架构核心组件 1.1 日志集中管理 设计目标:聚合所有节点的运行日志,支持实时查询与异常分析。 实现方式: 日志采集:各节点通过 logging 模块将日志发送至中央存储(如Elasticsearch或Redis)。 日志…...

MySQL的参数 innodb_force_recovery 详解

MySQL的参数 innodb_force_recovery 详解 innodb_force_recovery 是 InnoDB 存储引擎的一个重要参数,用于在数据库崩溃恢复时控制恢复行为的级别。这个参数主要在数据库无法正常启动时使用,可以帮助我们从损坏的数据库中恢复数据。 一 参数概述 参数名…...