1. 字节码指令集:
相当于中央处理器cpu:Class文件本质上就是16进制编码,由于16进制编码理解成本过大,因此有指令集和16进制编码一一对应,方便用户去理解因此对于Class文件的可视问题,程序员是看指令集,JVM是看16进制编码(指令集 == 16进制编码)。
2. Class文件格式(class文件本义就是16进制编码)
在eclipise的bin文件-》jvm中可以查看class代码,也可以使用16进制编辑器打开(原始文件)也可以用javap输出出来。分为两种类型:无符号数和表
Class文件是一组以8字节为单位的字节流,各个数据项目按顺序紧凑排列
对于占用空间大于8字节的数据项,按照高位在前的方式分割成多个8字节进行存储.
魔数:magic开头的u4(四位0xCAFEBABE)
Atttibute:属性,不过不同于fields的,他是在类外面的辅助信息
常量池(16进制):(通过规范)首先知道有几位,通过tag找对应的常量类型(如08对应 String,01对应的utf8),再根据不同的常量类型里的结构获取新的信息(结合javap生成的可阅读class文件)了解,会阅读即可即可
Class文件格式
<index>:数组下标,数组以字节形式存储当前方法的java虚拟机代码,也可以是相对于方法的字节偏移量。
<opcode>:指令的助记码;<operand>:操作数
<comment>:行尾的注释
Stack表示操作栈的深度;locals:局部变量所需的存储空间,单位是slot(虚拟机为局部变量内存使用的最小单位)
3. 数据类型和值:
4. 运行时数据区:了解虚拟机内存模型的概况
程序计数器:当前线程执行的字节码的行号指示器
虚拟机栈
本地方法栈
Java堆
方法区(非堆)
运行时常量池:方法区的一部分
直接内存(其实不是虚拟机运行时数据区的一部分)
5. 栈帧
6. 特殊方法:两类
<init>实例初始化方法
<clinit>:类或接口初始化方法,staticvoid
7. 类库
反射:
加载和创建类或接口:如classloader
链接初始化类和接口的类
底层安全如security
多线程
弱引用(垃圾回收)
8. 异常
如何处理异常从而实现程序控制权的转换