利用五一小假期,看了一下java的类class文件结构,在此记录一下学习笔记。java
字节码并发
程序的存储格式。语言无关。学习
跨平台。翻译
class文件 — 概述对象
- 包含了Java虚拟机指令集和符号表,以及若干其余辅助信息。
- class文件是一组以8位字节为基础单位的二进制流。大端方式存储。
class文件 — 结构继承
- 魔数、class文件的版本
魔数:肯定这个文件能被虚拟机接受。4个字节:0xCAFEBABE
版本:紧接着魔数后面。4个字节。
第五、6个字节标识次版本号。
第七、8个字节标识主版本号。
- 常量池
紧接着版本号,资源仓库。
主要存放两大类常量:字面量(文本字符串、声明为final的常量值等)、符号引用。
java代码javac编译,在虚拟机加载class文件时动态连接。
当虚拟机运行时,须要从常量池获取对应的符号引用,再在类建立或运行时解析、翻译到具体的内存地址中。
Java中若是定义超过64KB英文字符的变量或方法名,将没法解析。
- 访问标志
用于识别一些类或接口层次的访问信息。
好比public、final等。
- 类索引、父类索引、接口索引集合
用这三项数据来肯定这个类的继承关系。
类索引:肯定这个类的全限定名。
父类索引:用于肯定这个类的父类的全限定名。
接口索引集合:用来描述这个类实现了哪些接口。
- 字段表集合
用于描述接口或者类中声明的变量。
包括的信息:字段的做用域、实例变量仍是类变量、可变性、并发可见性、能否被序列化、字段数据类型、字段名称。
- 方法表集合
对方法的描述,相似字段表集合。
方法里的java代码,存储在“Code”属性里。
Java中,要重载一个方法,要求必须拥有一个与原方法不一样的特征签名。
- 属性表集合
在class文件、字段表、方法表中,均可以携带本身的属性表集合,以用于描述某些场景专有的信息。
字节码指令简介索引
由一个字节长度的、表明着某种特定操做含义的数字、以及跟随其后的0至多个表明此操做所需参数构成。接口
- 字节码
大部分的指令都没有支持byte、char、short,甚至彻底没有boolean类型。编译器会在编译期或运行期将byte、short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为相应的int类型数据。
大多数对于boolean、byte、short、char类型数据的操做,实际上都是使用相应的int类型做为运算类型。
- 加载和存储指令
用于将数据在栈帧中的局部变量表和操做数栈之间来回传输。
- 运算指令
用于对两个操做数栈上的值进行某种特定的运算,并把结果从新存入到操做栈顶。
分为两种:对整型数据进行运算的指令、对浮点型数据运算的指令。
舍入操做:向最接近数舍入模式。
- 类型转换指令
将两种不一样的数值类型相互转换。
宽化类型转换、窄化类型转换。
- 对象建立与访问指令
new、newarray、getfield、putfield、baload、bastore、arraylength、instanceof等等。
- 操做数栈管理指令
pop、dup、swap等等。
- 控制转移指令
在有条件或无条件地修改PC寄存器的值。
- 方法调用和返回指令
invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic等
- 异常处理指令
显示抛出异常:athrow;
虚拟机检测到异常字段抛出:如ArithmeticException。
- 同步指令
使用管程来实现。
初步看完,有的地方仍是有点难理解,并且感受过段时间就会忘记。惟有往后不断思考、复习来加深印象。内存