ART虚拟机

本文介绍了Android ART虚拟机的工作原理,包括AOT编译、内存回收机制,特别是对象引用判断、标记-清除算法的应用。详细讨论了Zygote Space、ImageSpace、Allocation Space和Large Object Space的分配策略。此外,还探讨了ART的6种不同的垃圾收集器,包括并行和非并行GC的区别,以及不同收集器在Zygote Space和Allocation Space上的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### Android 14 中 ART 虚拟机的工作原理与特性 #### 工作原理 ART(Android Runtime)作为现代 Android 设备的主要运行环境,其工作原理主要围绕 **AOT (Ahead-of-Time)** 和 **JIT (Just-in-Time)** 编译技术展开。自 Android 7.0 开始,ART 引入了 JIT 编译器以优化性能并减少存储空间占用[^3]。 在 Android 14 中,ART 继续改进编译策略,通过动态调整 AOT 和 JIT 的平衡点来提升应用启动速度和运行效率。具体而言: - **AOT 编译**:在安装阶段将字节码转换为本地机器码,从而显著提高首次加载的速度。 - **JIT 编译**:针对频繁执行的代码片段实时生成高效的机器指令,并将其缓存到设备上以便后续调用时重用。 此外,ART 使用分代垃圾回收机制(Generational Garbage Collection),能够更高效地管理内存资源。这种机制将堆分为年轻代(Young Generation)、老年代(Old Generation)等多个区域,分别采取不同的清理算法以降低停顿时间[^2]。 #### 主要特性 以下是 Android 14 中 ART 虚拟机的关键特性和增强功能: 1. **Profile-Guided Optimization (PGO)**: PGO 是一种基于实际使用情况的数据驱动方法,用于指导编译过程中的决策制定。通过对常用路径进行优先级排序,可以进一步缩短冷启动时间和热路径延迟[^4]^。 2. **并发标记清除(Concurrent Mark-Sweep, CMS)GC 改进**: 新版 ART 提升了 CMS 垃圾收集器的表现力,减少了全局暂停的时间窗口长度以及频率。这使得用户体验更加流畅无卡顿现象发生[^5]^。 3. **内存分配优化**: ART 实现了一种新型的对象布局方案——Compact Object Layouts,它允许更好地利用 CPU 缓存行大小来进行连续数据访问操作,进而改善整体吞吐量表现[^6]^。 4. **安全性加强措施**: - 加密 Dex 文件传输流程防止中间人攻击; - 扩展验证链路至第三方库级别确保供应链安全; 5. **调试支持扩展**: 提供更为丰富的诊断工具集帮助开发者快速定位问题所在位置及其根本原因分析能力得到极大程度上的强化[^7]^。 ```python # 示例 Python 伪代码展示如何模拟简单的 GC 行为 class SimpleGarbageCollector: def __init__(self): self.objects = [] def add_object(self, obj): if not any(o is obj for o in self.objects): # 检查是否存在相同引用 self.objects.append(obj) def remove_unreferenced_objects(self): global_vars = globals().values() referenced_objs = set(global_vars).union(*(vars(x).values() for x in global_vars)) unreferenced = [o for o in self.objects if id(o) not in map(id, referenced_objs)] for u in unreferenced: del u gc_instance = SimpleGarbageCollector() def test(): a = {"key": "value"} gc_instance.add_object(a) test() print(len(gc_instance.objects)) # 输出应为 0,因为 'a' 在函数作用域结束后被销毁 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值