对应JVM一直认为是非常高深的东西(确实不简单),不敢去折磨,最近看Android相关的知识想了解下Dalvik虚拟机,顺便了解了Java虚拟机,查了一些相关的资料,就当为自己mark。
1.JVM概念
JVM(Java Virtual Machine)是Java虚拟机
2.JVM与“Class文件”的关系
Java虚拟机只与“Class文件”关联,与语言和文件的来源无关,如:可以通过Java、Ruby生成一个class文件,甚至可以按照“Class文件”的文件格式自己手动编写一个class文件,但是这个文件有特定的结构,下面详细介绍。
3.class类文件结构
class文件是一组以8位字节为基础单位的二进制流,各种类型数据严格按照顺序紧密排列在一起,中间没有间隔,如果遇到大于8位字节的数据,则分割为多个8位字节进行存储。
如下为一个class类文件内部结构:
魔数
每个class文件头4个字节为魔数。他唯一的作用就是用来区别是不是Java虚拟机能个接受的class文件,Java虚拟机能接受的魔数是“CA FE BA BE”。
JDK版本
魔数后面的4个字节对应的是JDK版本,可以向后兼容,比如当前class是JDK 1.5生成的,则JDK 1.6可以接受,但是JDK 1.4不能接受。
常量池
常量池可以理解为class文件需要引用的类型,如Integer,Long等。
表
表包括字段表、方法表、属性表等,表可以理解为一个结构体。
类别 | 长度 | 具体内容 |
---|
如:01/00 10/6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74:这是该常量池的第4项,CONSTANT_Utf8_info常量,长度是16(0x0010),正是字符串常量“java/lang /Object”。
4.字节码指令
Java虚拟机的指令只有一个字节的长度,所以指令的个数最多只有256个,并不是每一种类型都会有一个指令,会通过一些其它处理来合并指令。
01/00 10/6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74
5.虚拟机类加载
加载
加载class文件,class文件可以来至网络或本地等
验证
保证class文件字节流符合Java虚拟机的要求,并且不会危害到Java虚拟机。需要验证class文件内部的大致结构
准备
准备阶段是为类变量分配内存并设置变量的初始值,类变量是指static修饰的变量
解析
具体解析的过程
初始化
其它资源的初始化,如构造函数
6.类加载器
类加载器是用来加载类的。
- 两个类对象如果类加载器不同,是没有可比性的,一定不相等(equals和isInstances)
- 两个类对象如果类加载器相同,可以是相同的
- 类加载器可以直接通过构造函数参加,也可是系统类加载器
分类
Bootstrap ClassLoader
Extension ClassLoader
Application ClassLoader
User ClassLoader