ART 和 Dalvik 虚拟机

ART 和 Dalvik 虚拟机

android runtime(ART)是android application用来管理运行时和系统服务的。ART和它的后序Dalvik虚拟机是为android项目而被创建的。ART作为运行时执行了Dalvik可执行格式的dex字节码规范。
ART和Dalvik非常适合执行dex字节码,所以为Dalvik开发的app即使你运行在ART上也能运行。然而,一些在Dalvik上能工作的一些技术,在ART上不一定能生效。更多的相关信息请阅读Verifying App Behavior on the Android Runtime (ART).

ART的一些特性

Ahead-of-time(AOT)Compliation 预编译

AOT 预编译特性能够很大的提升 APP的性能,ART也有着比davlik跟严格的安装时间验证。
在APP安装的时候,ART使用dex2oat 工具编译app,这个工具将DEX文件作为输入,然后为目标设备生成一个可执行的完整app。这个工具能够很简单的编译所有的dex文件。然而,一些后处理工具可能产生一些能被davlik接受的无效dex文件,但是那些文件是不能被ART编译通过的。如果你需要了解更过信息,阅读Addressing Garbage Collection Issues

提高了垃圾回收能力

GC 可以影响app的性能,导致显示出现波浪,卡顿的ui交互,或者其他问题。ART从以下几点提高了垃圾回收能力。

  • 由两次GC暂停变为一次GC暂停(译者注:GC回收的时候,会出现一种所有线程暂停的状态,jvm中称为stop the world,保证全部对象不再变化,是GC回收对象的基础)
  • 在GC暂停的时候,并发处理(译者注:指的是垃圾回收线程并发)
  • 由于特殊原因回收新生代(译者注:java中这个称呼的)对象内存会花费更少的时间。
  • 提高了垃圾回收的经济效益,使并行的垃圾回收处理更及时,这样的带来的好处是,FULL GC事件变得基本不可能发生。
  • 压缩化的GC减少了后台内存的使用和内存碎片

优化了开发和调试

ART提供了一系列的特性,用于优化开发和调试

提供了简单的分析器
追溯到历史,开发者可以使用 TraceView 工具作为一个简单的分析器(为跟踪application执行而设计的工具),然而TraceView给出有用的提示,它在davlik虚拟机的结果会被每一个方法调用过度交叉,并且使用这个工具能够显著的影响运行时候的性能。
ART 增加了专注的简单的分析器而且没有任何限制。这提供了一个观察app运行的精确方式并且没有明显的滞缓作用。在Kitkat(译者注:4.4以后)这个对TraceView的简单支持被加入到Android中。

支持更多的调试相关的特性

ART支持一些新的调试选项,特别是在在模拟和垃圾回收相关的功能上。例如,你可以看到以下特性
可以在Stack Traces中看到持有怎样的锁,并且跳到持有这个锁的对应线程中去。
可以根据给出的类,知道存在多少个实例对象,并且可以知道有多少个引用持有这个对象。
特殊实例的事件过滤(就像断点)
可以查看函数的返回值,如果它有返回值的话(使用method-exit事件)
当一个特定的字段被访问或者修改的时候,可以设置一个field watchpoint 去暂停在程序的执行。
提高了发生exception和crash报告的诊断细节
ART可以提供在发生运行时异常和奔溃足够的上下文和信息。ART为ClassCastException,ClassNotFoundException 和 java.lang.NullPointerException 提供了扩展的细节.(新版本的Davlik虚拟机会给java.lang.ArrayIndexOutOfBoundsException 和 java.lang.ArrayStoreException提供扩展的异常抛出细节,这些包括了数组大小和下标越界)
例如,java空指针异常,会提供更多的信息帮助你处理空指针,比如app 尝试写操作的数据域,或者尝试调用的方法。下面是一组示例

java.lang.NullPointerException: Attempt to write to field ‘int
android.accessibilityservice.AccessibilityServiceInfo.flags’ on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
‘java.lang.String java.lang.Object.toString()’ on a null object reference

ART也提供了一些上下文信息帮助报告一个native crash,同时包括了java 栈和本地方法栈的信息。
(译者注:在jvm的内存模型中,分为java 方法栈和native 方法栈,两者的都会发生溢栈,但是两者需要加以区分)

原文地址 ART and Dalvik

发布了49 篇原创文章 · 获赞 11 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章