大家好,我是森森
这节课我简单给大家介绍一下java虚拟机跟安卓系统虚拟机的区别.可能时间太晚了,有点不在状态,也有点紧张,大家见谅.
这篇文章重点写一写安卓运行时和Java运行时的区别.
什么是运行时呢?其实我们所说的虚拟机就是运行时.
两种虚拟机有什么不同呢?
先说Java虚拟机,它的工作流程是这样的,首先编写一个Java代码,然后用Javac这个指令,把它编译成.class文件的字节码文件,我们想要运行这个字节码文件,必须要把它放到虚拟机里(
JVM)去装载执行.
安卓呢,它也有自己的虚拟机,叫dalvik virtual machine,我们平时都叫它dalvik虚拟机.dalvik虚拟机的编译过程要比JVM多了一个步骤,那就是Java的字节码文件还要经过进一步处理,经过dex compiler,也就是dex编译器,把它转成dalvik byte code,dalvik类型的字节码,然后再放到dalvik虚拟机里运行,那这个过程到底做了什么操作呢?大家也看了视频里的实验,就是同样的大小,整个文件要比多个文件的文件夹拷贝的要快.同样的道理,在Java虚拟机要执行代码的时候,它要把所有的class字节码文件给装载进虚拟机里,假设,你写的这个应用有一百个Java代码,就会生成一百个.class的字节码文件,它把这些字节码文件一个个装载进来,然后去找到字节码,再去解析运行,它比较慢,而dalvik虚拟机,它所有的代码,只会生成一个dex文件,这个dex文件直接装载到dalvik虚拟机就可以解析执行了,运行效率会比较高.
另外,dalvik虚拟机还会对字节码文件做很多优化操作,普通的Java虚拟机,每个class文件都有一个header,这个头包含着编译器的版本,运行的jvm版本等信息,每个class文件都一个头,就比较浪费存储空间,而dalvik虚拟机是把所有class文件的头都给抽取出来,只生成一个公共的头,另外,像一般我们写代码的时候会有一些静态变量,比如说,你定义了一个public static final int i=1;它事实上是一个全局的静态的成员变量,这个值是不会发生修改的,如果很多代码有这样的定义,dalvik虚拟机就把这样的一些常量给抽取出来,有字符串的常量池,类型定义的常量池,字段的常量池,方法的常量池,所以,dalvik虚拟机更适合移动平台,它的效率更高,运行速度也更快.
另外呢,谷歌开发dalvik虚拟机还有一个原因,就是Java虚拟机版权问题,不是它自己的东西,用了得掏钱.视频中故事已经讲得很细,不再赘述.