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库接口创建线程
';