JVM和DVM的类加载

.java文件会java编译器生成Class文件。这个Class文件会被JVM虚拟机来处理。java虚拟机只与特定的二进制文件,即Class文件有关。

类的生命周期

一个java文件被加载到java虚拟机内存中到从内存中卸载的过程被成为类的生命周期,他们的阶段分别是


2019-01-10_145626.png
  1. 加载,查找并加载class文件
  2. 链接
    验证 确保被导入类型的准确性
    准备 为类的静态字段分配字段,并用默认值初始化这些字段
    解析 将常量池内的符号引用替换为直接引用
  3. 初始化 类变量

类加载

  1. 启动类加载器 Bootstrap Classloader,加载JDK核心类库
  2. 扩展类加载器 Extension ClassLoader,加载\lib\ext,或者被java.ext.dirs系统变量指定的类
  3. 应用程序类加载器,Application ClassLoader,加载ClassPath中的类库

双亲委托模式

首先判断该class文件是否已经加载,如果没有加载,委托父加载器去查找,直到最顶层bootstrap classloader。找到了就直接返回。该加载器的搜索范围中没有找到对应的类,则依次乡下查找。


879896-20160415085506488-408997874.png

好处:

  1. 可以避免重复加载
  2. 更安全.无法自定义string类替代系统的String类。只有两个类名一致,并被同一个类加载器加载的类,虚拟机才认为他们是同一个类。

android 的classloader

android的虚拟机加载的不是class,而是dex文件。android中的classloader分为两类,系统类加载器,自定义加载器。

2019-01-10_155632.png
  • BootClassLoader 预加载常用类
  • DexClassLoader 加载dex文件
  • PathClassLoader 加载系统类和应用程序类

DVM与JVM的区别

JVM基于则意味着需要去栈中读写数据,所需的指令会更多
DVM是基于寄存器的,Dalvik指令直接操作这些寄存器,而不是访问堆栈中的元素

DVM与ART区别

DVM中的应用每次运行时,字节码都需要通过即时编译器(JIT,just in time)转换为机器码,这会使得应用的运行效率降低。而在ART中,系统在安装应用时会进行一次预编译(AOT,ahead of time),将字节码预先编译成机器码并存储在本地,这样应用每次运行时就不需要执行编译了,运行效率也大大提升

你可能感兴趣的:(JVM和DVM的类加载)