聊聊ART虚拟机_如何保证高效执行

简介: 我们在前面两篇文章中聊到了 ART 虚拟机中对于对象的分配、使用和销毁的问题。主要了解其如何分配到对应的内存、通过几种手段来使用,且如何 ART 是如何最好的解决内存碎片的问题。

前置知识

前言

我们在前面两篇文章中聊到了 ART 虚拟机中对于对象的分配、使用和销毁的问题。主要了解其如何分配到对应的内存、通过几种手段来使用,且如何 ART 是如何最好的解决内存碎片的问题。

那么本文中,我们就继续聊一聊 ART 是如何使用几种方式来保持高效执行的。

执行方式

前文中我们有提到,在 ART 中的执行方式有三种:包括解释执行、JIT 执行和 AOT 执行。

1.webp.jpg

解释执行

其实就是去解释翻译 APK 包内的 .dex 代码,这个.dex 代码是所有 .class 文件的一个总集合,是由 Java代码翻译而来的。最后再由 ART 去解释执行。

下图中,我们打开 APK 文件可以看到对应的 .dex 文件。

1.webp.jpg

JIT 执行

对于 JIT 解释执行,它会在解释执行的时候,他会基于线程的执行位置以及优先级生成 profile 文件以及对此打分,如果分数达标,就会提交给 JIT 编译器编译以及进行 OSR 替换。(此处的打分只是一个形象的比喻)而对应的函数下一次执行的时候,就会换成 JIT 执行了,而不再是解释执行

1.webp.jpg

AOT 执行

AOT 是在程序运行之前,对 APK 中的函数进行编译。不像 JIT 是在程序执行阶段编译的。其有如下几个特点:

  1. 和程序是否允许无关
  2. 编译以 dex 为单位,而不是以函数为单位
  3. 结果持久化

AOT 与 JIT 的不一样的地方就是:

  • 不需要维持一块内存来保持 JIT 的结果
  • 不需要预热
  • 无法动态调整

上述的三类执行方式中,JIT 和 AOT 的方式的效率必然是要大于直接解释执行的。所以,在 ART 中,他们使用了以上的多种方式来进行结合执行,以提高 ART  的整体运行效率。

1.webp.jpg

延迟绑定

对于上面的 AOT 与 JIT ,为何 AOT 就会比 JIT 更优呢?这是由于绑定时间的不同所导致的。

绑定得越迟,动态性越好,性能越差

绑定得越早,动态性越差,性能越好

例如 Java 中对象的分配问题,是需要运行前进行继承链的寻找的,这就是延迟绑定,但是其动态性会好很多。例如在 Android 的 View 体系中,他也是延迟绑定的。其不能在编译阶段就确定对应使用的父类 View 是哪个,需要在安装的时候才能确定好,因为不同的 Android 版本的 View 类是不一致的,所以不能一开始就确定好父类,需要在安装好的时候才去确定。

栈管理

在 Java 中,基本类型变量和对象的引用都是放置在栈内存中的。而上述的三类执行方式,其对于栈的管理方式也是不同的。大体分为两类,解释执行是一类,而 JIT 和 AOT 的编译后执行又是一类。

解释执行部分,其将栈全权托管给虚拟机完成的;而对于编译后执行的一类,其遵从对应指令集的约定来对栈进行管理,其与 C++ 的约定类似,指定某些寄存器来进行执行和管理。

而这两种不同的栈管理方式之间,是可以采用一些机制来不断切换的。有兴趣的同学可以自行了解。

需要注意的是:栈管理中是和异常抛出有联系的,异常执行中的 catch() 是一种回栈行为。

多线程与同步问题

在 java 中,可能会出现线程不同步的问题,例如两个线程共享一个变量的时候会出现获得的两个变量的值不一致的问题,因为在 Java 中,是默认对变量复制之后,再去操作复制的的变量的,所以会导致这个不同步的问题。

1.webp.jpg

所以,为了解决这个问题,会需要使用同步机制。我们可以使用 synchronize 语句来加锁解锁,而在前文中提到的 monitor 的信息就是保存锁的信息,其先生成胖锁,后转化为瘦锁。

1.webp.jpg

瘦锁(spinLock):由锁主动去响应,但是消耗很大

胖锁(mutexlock):由执行方去通知锁,但是消耗小

胖锁和瘦锁的切换机制,但要自定义只使用瘦锁的时候,可以使用自定义的 volatile 来实现

volatile :解决三个问题。语序重拍,读时未同步,写时被修改。实现原理是基于读写栏栅处理cpu读写顺序,同时处理编译时候严格按照编码顺序处理。

1.webp.jpg



相关文章
|
存储 算法 Java
聊聊ART虚拟机_对象的分配问题
ART 虚拟机(下图 Runtime 层),相信各位搞 Android 开发的同学都有知道,总体的印象呢就是:ART 与 JVM 不同,其不符合 JVM 规范不属于 JVM ,且为 Dalvik 的进阶版。
聊聊ART虚拟机_对象的分配问题
|
存储 缓存 算法
聊聊ART虚拟机_对象的使用和销毁问题
在上一篇文章中,我们聊到了对象的分配问题,简单说明了何为 ART 虚拟机,以及对象中类的加载、内存布局等问题。本文继接上文,将会讲完对象的使用和销毁的问题,希望本文对你有所帮助。
聊聊ART虚拟机_对象的使用和销毁问题
|
Android开发 Java C++
带你读《深入理解Android:Java虚拟机ART》之一:本书必读
本书将关注Android系统中至关重要的部分——Java虚拟机ART。随着Android设备的大规模普及,ART虚拟机已经成为当今使用最为广泛的JVM之一。所以,对ART虚拟机进行研究有着非同寻常的意义。本书的出现在一定程度上填补了这方面的空白。
|
Java 编译器 Android开发
【Java 虚拟机原理】动态字节码技术 | Dalvik & ART 虚拟机 | Android 字节码打包过程
【Java 虚拟机原理】动态字节码技术 | Dalvik & ART 虚拟机 | Android 字节码打包过程
303 0
【Java 虚拟机原理】动态字节码技术 | Dalvik & ART 虚拟机 | Android 字节码打包过程
|
安全 Android开发
【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | ART 虚拟机下 DexClassLoader 类加载器脱壳点总结 )
【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | ART 虚拟机下 DexClassLoader 类加载器脱壳点总结 )
332 0
|
缓存 Java Shell
Android上的ART虚拟机
本会讲解Android上的ART虚拟机。 我的博客中,还有另外两篇关于Android虚拟机的文章也可以配套阅读: * [Android上的Dalvik虚拟机](https://paul.pub/android-dalvik-vm/) * [Android上ART虚拟机](https://paul.
7036 0
|
算法 Java Android开发
Android热修复技术初探(一):了解Dalvik与Art虚拟机
1. 为什么需要热修复技术 当我们的Android应用程序发布到各大市场上之后,如果出现了重大bug,大部分情况下只能通过紧急发包升级来解决问题,但是这会带来以下几个问题: 应用升级需要一定的时间,时效性差,如iOS应用发布审核可能需要好几天; 需要...
1650 0
|
4天前
|
安全 虚拟化 数据中心
Xshell 连接 VMware虚拟机操作 截图和使用
Xshell 连接 VMware虚拟机操作 截图和使用
27 4