------------------参考《深入理解Java虚拟机》学习---------------------
看完这一章, 完全是这样感觉,我是谁?我在哪?我要干什么?头顶一片乌鸦飘过,看看下一章是类加载器,好吧看不懂了。正在一片黑暗的时候,瞥见了另一本神书《深入解析Java虚拟机》,好像看到了阳光(其实是另一个坑)。
to be or not to be;不服就干,死磕到底
废话太多了,学习!!!

平台的无关性

大家都知道Java是一次编译,到处运行,也都是知道java文件编译成class文件就可以在通过JVM运行。但是是为什么?Java的出现就是为了打破平台限制,所有的虚拟机和平台是统一使用程序存储格式——字节码,虚拟机通过载入和执行这些字节码实现平台的无关性;
Java虚拟机并不是只能执行Java程序,在第一版Java虚拟机规范就说“以后会对Java虚拟机进行扩展以支持更多的语言在JVM上,并且在JDK1.7~1.8的时候基本实现(Jython、Scala等)”
第五章——深入class文件结构
Java语言中的变量、关键字、类名等等的语义都是由多条字节码命令组合而成的,所以字节码的语义描述能力肯定会比Java语言更强大。

Class类文件的结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中国,没有添加任何分隔符。
第五章——深入class文件结构

  • class文件结构
    第五章——深入class文件结构

魔数及版本号

魔数:前四个字节,作用是确定这个文件是否是虚拟机接受的Class文件,值为:0xCAFEBABE
版本号:第五、六字节是次版本号(Minor Version);第七、八字节是主版本号(Major Version)。
注:Java版本号:45.3~53;
第五章——深入class文件结构

常量池

常量池是Class文件的资源仓库,是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据类型。第九、十个字节表示常量池的个数(常量池是从1开始而不是0!我的这边是0x22=34,但是常量个数33)
每个常量由三个字节来描述,第一个字节是常量类型,后两个字节是常量池索引地址。
第五章——深入class文件结构
使用javap命令输出常量表
第五章——深入class文件结构
14种常量项结构参考《深入理解java虚拟机》P172-173

访问标志

常量池后面的两个字节表示,是类还是接口以及是什么类型的

JVM指令集

类相关的指令、方法的定义、属性的定义、与栈操作、与本地变量操作相关、与运算相关、与常量操作相关、与ava控制指令相关、与Java数据类型转换相关、与Java同步操作相关、与Java数组操作相关等
参考《深入分析Java Web》第五章

属性表集合

  1. Code:Java程序方法体中的代码经过Javac编译器处理后,变为字节码指令存储在Code属性中。
  2. Exception:列举出可能抛出的受查异常,也就是方法描述时在throws关键字后面列举的异常
  3. LineNumberTable:描述Java源码行号与字节码行号(字节码的偏移量)之间的对应关系
  4. LocalVariableTable:描述帧中局部变量表中的变量与Java源码中定义的变量之间的关系。
  5. SourceFile:记录生成这个Class文件的源码文件名称
  6. ConstantValue:通知虚拟机自动为静态变量赋值

参考《深入理解Java虚拟机》P181~196

相关文章: