.java文件会java编译器生成Class文件。这个Class文件会被JVM虚拟机来处理。java虚拟机只与特定的二进制文件,即Class文件有关。
类的生命周期
一个java文件被加载到java虚拟机内存中到从内存中卸载的过程被成为类的生命周期,他们的阶段分别是
2019-01-10_145626.png
- 加载,查找并加载class文件
- 链接
验证 确保被导入类型的准确性
准备 为类的静态字段分配字段,并用默认值初始化这些字段
解析 将常量池内的符号引用替换为直接引用 - 初始化 类变量
类加载
- 启动类加载器 Bootstrap Classloader,加载JDK核心类库
- 扩展类加载器 Extension ClassLoader,加载\lib\ext,或者被java.ext.dirs系统变量指定的类
- 应用程序类加载器,Application ClassLoader,加载ClassPath中的类库
双亲委托模式
首先判断该class文件是否已经加载,如果没有加载,委托父加载器去查找,直到最顶层bootstrap classloader。找到了就直接返回。该加载器的搜索范围中没有找到对应的类,则依次乡下查找。
879896-20160415085506488-408997874.png
好处:
- 可以避免重复加载
- 更安全.无法自定义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),将字节码预先编译成机器码并存储在本地,这样应用每次运行时就不需要执行编译了,运行效率也大大提升
网友评论