------------------参考《深入理解Java虚拟机》学习---------------------
看完这一章, 完全是这样感觉,我是谁?我在哪?我要干什么?头顶一片乌鸦飘过,看看下一章是类加载器,好吧看不懂了。正在一片黑暗的时候,瞥见了另一本神书《深入解析Java虚拟机》,好像看到了阳光(其实是另一个坑)。
to be or not to be;不服就干,死磕到底
废话太多了,学习!!!
平台的无关性
大家都知道Java是一次编译,到处运行,也都是知道java文件编译成class文件就可以在通过JVM运行。但是是为什么?Java的出现就是为了打破平台限制,所有的虚拟机和平台是统一使用程序存储格式——字节码,虚拟机通过载入和执行这些字节码实现平台的无关性;
Java虚拟机并不是只能执行Java程序,在第一版Java虚拟机规范就说“以后会对Java虚拟机进行扩展以支持更多的语言在JVM上,并且在JDK1.7~1.8的时候基本实现(Jython、Scala等)”
Java语言中的变量、关键字、类名等等的语义都是由多条字节码命令组合而成的,所以字节码的语义描述能力肯定会比Java语言更强大。
Class类文件的结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中国,没有添加任何分隔符。
- class文件结构
魔数及版本号
魔数:前四个字节,作用是确定这个文件是否是虚拟机接受的Class文件,值为:0xCAFEBABE
版本号:第五、六字节是次版本号(Minor Version);第七、八字节是主版本号(Major Version)。
注:Java版本号:45.3~53;
常量池
常量池是Class文件的资源仓库,是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据类型。第九、十个字节表示常量池的个数(常量池是从1开始而不是0!我的这边是0x22=34,但是常量个数33)
每个常量由三个字节来描述,第一个字节是常量类型,后两个字节是常量池索引地址。
使用javap命令输出常量表
14种常量项结构参考《深入理解java虚拟机》P172-173
访问标志
常量池后面的两个字节表示,是类还是接口以及是什么类型的
JVM指令集
类相关的指令、方法的定义、属性的定义、与栈操作、与本地变量操作相关、与运算相关、与常量操作相关、与ava控制指令相关、与Java数据类型转换相关、与Java同步操作相关、与Java数组操作相关等
参考《深入分析Java Web》第五章
属性表集合
- Code:Java程序方法体中的代码经过Javac编译器处理后,变为字节码指令存储在Code属性中。
- Exception:列举出可能抛出的受查异常,也就是方法描述时在throws关键字后面列举的异常
- LineNumberTable:描述Java源码行号与字节码行号(字节码的偏移量)之间的对应关系
- LocalVariableTable:描述帧中局部变量表中的变量与Java源码中定义的变量之间的关系。
- SourceFile:记录生成这个Class文件的源码文件名称
- ConstantValue:通知虚拟机自动为静态变量赋值
参考《深入理解Java虚拟机》P181~196