美文网首页
JVM和DVM的类加载

JVM和DVM的类加载

作者: 30cf443c3643 | 来源:发表于2019-01-10 16:41 被阅读17次

    .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的类加载

          本文链接:https://www.haomeiwen.com/subject/xurarqtx.html