ART虚拟机

深入理解ART虚拟机—ART的函数运行机制 前面两篇文章介绍了ART的启动过程,而在启动之后,我们感兴趣的就是ART是怎么运行的。回顾一下虚拟机系列的前面几篇文章,我们可以理一下思路: 一,apk以进程的形式运行,进程的创建是由zygote。 参考文章《深入理解Dalvik虚拟机- Android应用进程启动过程分析》 二,进程运行起来之后,初始化JavaVM 参考文章《深入理解ART虚拟机—虚拟机的启动》 三,JavaVM创建之 阅读详情

ART执行的字节码所以速度会很快,使用AOT(AHead of Time)相对于JIT(Just In Time)会在应用创建的时候将dex编译成字节码时时间会比较长占用空间会比较大

之所以会无缝的替换是因为他实现了虚拟机的接口

内存回收机制

对象的是否被引用 引用链

清除算法 标记-清除

堆分配


ImageSpace 包含了用于预加载系统类对象,这些对象都是在创建oat时创建得到的,存储在boot.art@classes.dex中,以后启动可以不需要加载系统类对象节省时间

zygote 存储zygote继承创建的对象

allocation 和dvk中的active一样对象的创建都是在这个内存中实现的

large object 分配大对象的空间


因为写复制机制,zygote进程回合应用进程公用imageSpace和zygoteSpace


Art同样使用标记-清除算法执行清除对象的操作

不同的是他有6中不同的算法,同步三种,异步三种,分别为


MarkSweep类型的垃圾收集器,用来收集在Zygote Space和Allocation Space上分配的对象。

PartialMarkSweep类型的垃圾收集器,用来收集在Allocation Space上分配的对象

StickyMarkSweep类型的垃圾收集器,用来收集上次GC以来分配的对象




并行GC和非并行GC的区别在于:

        1. 非并行GC的标记阶段和回收阶段是在挂住所有的ART运行时线程的前提下进行的,因此,只需要执行一次标记即可。

        2. 并行GC的标记阶段只锁住了Java堆,因此它不能阻止那些不是正在分配对象的ART运行时线程同时运行,而这些同进运行的ART运行时线程可能会引用了一些在之前的标记阶段没有被标记的对象。如果不对这些对象进行重新标记的话,那么就会导致它们被GC回收,造成错误。因此,与非并行GC相比,并行GC多了一个处理脏对象的阶段。所谓的脏对象就是我们前面说的在GC标记阶段同时运行的ART运行时线程访问或者修改过的对象。

        3. 并行GC并不是自始至终都是并行的,例如,处理脏对象的阶段就是需要挂起除GC线程以外的其它ART运行时线程,这样才可以保证标记阶段可以结束。

        从前面ART运行时垃圾收集机制简要介绍和学习计划一文可以知道,GarbageCollector类有三个直接或者间接的子类MarkSweep、PartialMarkSweep和StickyMarkSweep都可以用来执行垃圾回收,其中,PartialMarkSweep类又是从MarkSweep类直接继承下来的,而StickyMarkSweep类是从PartialMarkSweep类直接继承下来的。MarkSweep类用来回收Zygote Space和Allocation Space的垃圾,PartialMarkSweep类用来回收Allocation Space的垃圾,StickyMarkSweep类用来回收上次GC以来在Allcation Space上分配的最终又没有被引用的垃圾。



参考文章

https://blog.youkuaiyun.com/luoshengyang/article/details/39256813

https://blog.youkuaiyun.com/luoshengyang/article/details/42072975

深入理解ART虚拟机—虚拟机的启动 看art虚拟机也有一段时间了,是时候写点什么出来了。早先看art的时候,发现不是太能理解,所以就恶补了一下dalvik虚拟机,所以有了之前的dalvik系列,等再次回头看art的时候,确实轻松了不少。 art从Android L开始正式替换dalvik,成为Android的默认虚拟机,L的art源码和之前KK的差别比较大,网上很多分析ART的文章都是基于KK的art源码。L开始art才走向成熟, 阅读详情

相关推荐

ART 虚拟机 — Interpreter 模式

前言 ART 虚拟机执行 Java 方法主要有两种模式:quick code 模式和 Interpreter 模式; quick code 模式:执行 arm 汇编指令 Interpreter 模式:由解释器解释执行 Dalvik 字节码 本篇文章就来讲一下,Interpreter 模式是如何运行的 一、 Interpreter 模式 点击查看大图 上图是将断点打在 art_q...

啃着地瓜数星星 6777

JAVA面试题分享五十四:GC什么时候会触发?

请注意,具体的GC触发时机可能会因JVM的实现和配置不同而有所差异。

之乎者也·的博客 2024

Android虚拟机ART

Android虚拟机ART

ART虚拟机内存分配原理浅析

简单总结了一下art虚拟机内存分配的原理,通过这些点我们可以对安卓里这些java对象如何分配有一个简单的认知,对排查内存相关问题,研究一些内存性能优化方案建立一个基础。ART虚拟机内存分配原理浅析。

chuyouyinghe的专栏 557

hookjava方法,基于art虚拟机.zip

hookjava方法,基于art虚拟机.zip

[苹果开发者账号]03 申请APPID、苹果开发者账号 常见问题整理

目录:问题持续更新问题一:提示:抱歉,您暂时不能注册问题二:Apple Developer Support提示:联系我们以继续流程 问题一:提示:抱歉,您暂时不能注册 申请苹果开发者账号,应该先注册AppleID,由于很多都是申请的公司使用的苹果开发者账号。一般操作申请动作的人,可能是新手操作,也可能图方便,有些信息会随便填写。 有些人会把姓名填写为,公司的产品、简称、缩写等等。这是不对的。 还有出生日期也会随便乱填。生日如果填写的不对,会被苹果限制使用一些功能的(苹果给的提示不是太明确)。 当生日填写的

专注于技术开发、项目管理 1万+

ART运行时垃圾收集机制简要介绍和学习计划

1.ART运行时堆的创建过程。 2.ART运行时的对象分配过程。 3.ART运行时的垃圾收集过程。

疾风剑豪 751

STM32 伺服电机 指令脉冲+方向位置控制模式 主从定时器 实现PWM脉冲数精确控制

实验室有个项目涉及到多个步进电机以及伺服电机的控制,需要电机得到一个触发信号后精确移动一段距离。 下面以单个伺服电机控制为例,利用伺服电机的指令脉冲加方向位置控制模式实现jing'que ...

phcdd的博客 2万+

《深入理解 Android ART 虚拟机》笔记

另外,ART 还借助一种称之为 Lock Hierarchies 的方法来解决线程同步时经常出现的因为使用锁的顺序不一样导致死锁的问题(即线程应该按相同的顺序抢占互斥锁,比如先锁住互斥锁A,接着再锁住互斥锁B,否则极易出现死锁的情况)。很多人以为 Java 字节码编译成机器码后就能和那些 C/C++ 编译得到的机器码一样无所羁绊地直接在OS上运行了,殊不知在Java字节码编译为机器码的过程中,虚拟机会添加一些必要和特殊的指令,使得得到的机器码在运行过程中实际上离不开虚拟机的管控。笔者称这种双字节元素为。

川峰的博客 4184

RK3588 Buildroot 新建板级DTS

在rk3588 linux开发过程中,新创建板型主要基于硬件差异化、软件适配与优化、项目定制化等多方面需求。

501846585_QQAndroid_java 1298

[特殊字符] PetaLinux Qt 程序(WindRadar)无法自动启动问题解决文档

摘要:本文档解决了PetaLinux 2020.1系统中Qt程序(WindRadar)无法开机自动显示界面的问题。通过分析发现,自动启动时缺少DISPLAY=:0.0环境变量导致Qt找不到显示设备。最终在autostart.sh脚本中添加该变量,并完善了字体加载、驱动加载、显示设备检测等流程,确保程序正常自启显示界面。完整脚本包含路径检测、环境配置和错误处理,经验证各项功能均正常运行。

梁俊星的博客 326

Android 虚拟机 (Dalvik & ART)

我们知道Android的程序虽然也是使用Java/Kotlin语言编码,并生成.class字节码,但并不能运行在JVM上,而是运行在自己的VM上。而Android程序之所以不能在JVM上运行的根本原因是.class字节码文件并不是Android的最终可执行文件,而是一个过渡产物,最终会生成dex文件在Android VM上执行。Dalvik 虚拟机和 ART 虚拟机。

Elson的博客 5688

Python-编写点云处理软件(二)点云软件ui制作之仿CC界面

至本篇结束,我们已经能够获得一个有点模子的界面了,但是具体的功能还没有编写,后续的文章将逐渐完善功能。

weixin_43894929的博客 3953

Dalvik虚拟机、ART虚拟机

Dalvik虚拟机是Google区Android平台开发的虚拟机,它是Adnroid4.4以前的应用的解释执行器。Dalvik虚拟机并不是Java虚拟机(JVM)的替代器。 Dalvik虚拟机与Java虚拟机最大的不同就是Dalvik是基于寄存器,而Java虚拟机是基于栈的。为什么为这样呢?首先,Java高级程序语言是为了跨平台而被设计出来的,在运行前需要通过编译程序将Java代码翻译成中间代码(...

weixin_40763897的博客 2328

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

伶俐角少儿编程 709

YOLOv8与UNetV2融合:一种面向目标检测与图像分割的混合方法【附核心代码】

我们提出了一种基于YOLOv8和UNetV2相结合的混合架构。该架构利用YOLOv8作为主干进行目标检测,同时在YOLOv8的特征提取过程中,引入UNetV2来进行图像分割任务的增强。在该架构中,YOLOv8负责大范围目标检测和位置预测,而UNetV2则在检测网络的特征图基础上,通过其高效的上下文信息提取和细节恢复能力,进一步优化分割任务。在本文中,我们提出了一种改进YOLOv8的方法,通过引入图像分割网络UNetV2来提高图像分割检测性能。

一键难忘的博客 3524

Android虚拟机Dalvik和ART

虽然Android程序是使用Java语言开发的,当然,现在也可以使用kotlin语言。但是实际上我们开发出来的Android程序并不能运行在JVM上,而是只能运行在一个类似JVM的Android虚拟机上。Android虚拟机有两种,分别是Dalvik虚拟机和ART虚拟机。Dalvik虚拟机是Google自己设计的用于Android平台的虚拟机,它曾经是Android平台的核心组成部分之一。它负责加载dex/odex文件并解析成机器码然后执行。Dalvik虚拟机并没有遵循《Java虚拟机规范》,因此不能算是J

yihanss的博客 2298

DDR5 的 PI: DIMM 上 PMIC,正在制造一批“新型 EMI 问题”

DDR5 的 PI,不再只是“供电设计”,而是一次“噪声管理设计”。电压稳定本地调节高频噪声EMI 风险系统不确定性DDR5 真正难的地方,不是跑起来,而是——在最差条件下,它还能不能一直跑。而 DIMM 上那颗 PMIC,正是你绕不开的关键角色。

weixin_43199439的博客 181

android的ART虚拟机初探

背景在android4.4版本开始引入ART虚拟机,并从Android 5.0系统开始,ART虚拟机(Android Runtime)就彻底代替了原先的Dalvik虚拟机,成为Android系统上新的虚拟机。Dalvik虚拟机缺陷1.Dalvik是为32位设计的,不适用于64位CPU。2.单纯的字节码解释加JIT编译的执行方式,性能要弱于本地机器码的执行。3.无论是解释执行还是JIT编译都是单次运行过程中发生,每运行一次都可能需要重新做这些工作,这样做太浪费资源。

logic1001的博客 1060

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android ART运行时无缝替换Dalvik虚拟机的过程分析

Android 4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题。老罗不打算分析ART的实现原理,只是很有兴趣知道ART是如何无缝替换掉原来的Dalvik虚拟机的。毕竟在原来的系统中,大量的代码都是运行在Dalvik虚拟机里面的。开始觉得这个替换工作是挺复杂的,但是分析了相关代码之后,发现思路是很清晰的。本来就详细分析这个无缝的替换过程。

老罗的Android之旅 9万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

安卓虚拟机ART和Dalvik

安卓虚拟机ART和Dalvik

似霰的博客 2290

Android ART虚拟机

转载自:https://blog.youkuaiyun.com/luoshengyang/article/details/45017207 Android与ios相比,一直被人诟病它的流畅性。android的流畅性问题,有一部分原因就归结于它的应用程序和部分系统服务是运行虚拟机之上的,也就是运行在Dalvik虚拟机之上,而ios的应用程序和系统服务都是直接执行本地机器指令的。除了使用ATR替换Dalvik之...

u011337574的专栏 1万+
上一篇: DVK虚拟机
下一篇: Android架构
杨殿生
博客等级 码龄10年 11粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值