Android虚拟机之Dalvik虚拟机

最后更新于:2022-04-02 05:01:13

#### **Java虚拟机与Dalvik虚拟机区别** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/56881e3bb303f1470ff3ccbb7ff3f01d_1152x356.png) #### **Dex文件编译和优化** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/ca6ae5914e857eeaf3384f4b7a13b858_362x224.png) #### **内存管理** * Java Object Heap 大小受限,16M/24M/32M/48M * Bitmap Memory(External Memroy): 大小计入Java Object Heap * Native Heap 大小不受限 #### **垃圾收集(GC)** * Mark,使用RootSet标记对象引用 * Sweep,回收没有被引用的对象 #### **GingerBread之前** * Stop-the-word,也就是垃圾收集线程在执行的时候,其它的线程都停止 *  Full heap collection,也就是一次收集完全部的垃圾 * 一次垃圾收集造成的程序中止时间通常都大于100ms #### **GingerBread之后** * Cocurrent,也就是大多数情况下,垃圾收集线程与其它线程是并发执行的 *  Partial collection,也就是一次可能只收集一部分垃圾 * 一次垃圾收集造成的程序中止时间通常都小于5ms #### **即时编译(JIT)** * 从2.2开始支持JIT,并且是可选的,编译时通过WITH_JIT宏进行控制 * 基于执行路径(Executing Path)对热门的代码片断进行优化(Trace JIT),传统的Java虚拟机以Method为单位进行优化(Method JIT) * 可以利用运行时信息进行激进优化,获得比静态编译语言更高的性能 * 实现原理:http://blog.reverberate.org/2012/12/hello-jit-world-joy-of-simple-jits.html #### **Java本地调用(JNI)** * 实现Java与C/C++代码互调 * 大部分Java接口的都是通过JNI调用C/C++接口实现的 * 提供有NDK进行JNI开发 #### **进程和线程管理** * 与Linux进程和线程一一对应 * 通过fork系统调用创建进程 * 通过pthread库接口创建线程
';