件的结构拥有固定的格式,包含两部分的数据:
code
属性表包含的属性
max_stack
存储操作数栈的最大深度值。运行时用来确定分配栈帧中所需的操作数栈深度。
max_locals
局部变量所需的最大空间大小
符号引用
- 类与接口的全限定名
- 域的名称与描述符
- 方法名与描述符
该部分内容可以通过查表获得,不再赘述。
第七章 虚拟机类加载机制
类加载的过程
1. 加载
通过全类名获取该类的二进制字节流
解析字节流,将字节流所表达的静态存储结构转化为方法区的运行时数据结构 (这是什么东西?)
为该类创建一个 Class 对象,用来访问该类的类数据
2. 连接
为了确保加载的字节流时符合规范的,不会危害到虚拟机自身的安全。主要包括
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
为类变量分配内存并进行初步初始化(0/null) // 不应该是在类加载阶段完成的么?
将符号引用替换为直接引用
3. 初始化
- static fields and block init
4. 使用
5. 卸载
类加载器
一个加载器确定一个类的命名空间。同一个类由不同加载器加载后是不同的类。
双亲委派:当需要加载一个类时先使用父类加载器(其实这个地方不是很准确,父子关系是通过复合来实现的),若失败了,再使用当前的加载器。如果自己写一个 Object
类,编译可通过但是由于双亲委派,它永远都不会被加载。
第十章 早期(编译器)优化
// TODO: 因本章含有相当多的编译原理相关概念,所以第十、十一章学习延后(预计第 8-9 周)
前端编译过程(*.java --> *.class
)
解析与填充符号表
词法分析。将源代码转换为标记(Token) 的集合
- Token: 是编译过程中的最小元素。例如关键字、变量名、运算符等等
语法分析。通过 Token 序列将构造抽象语法树(Abstract syntax tree)
参考
- 郑州大学姜志明老师课件
- 初探Java字符串 (非常好的一篇文章)
- Java HotSpot VM 参数
- Java HotSpot Virtual Machine Garbage Collection Tuning Guide
- JVM 垃圾回收器工作原理及使用实例介绍 — IBM
- Minor GC vs Major GC vs Full GC
- Abstract syntax tree
- 4.4 Symbol Tables