https://github.com/waylau/java-virtual-machine-specification
一、程序的执行流程
https://docs.oracle.com/javase/specs/jls/se11/html/jls-12.html
1. 加载(load)
找到二进制数据,load到内存
2. 链接(link)
Verify, 检查数据格式,符号表,
Prepare, 静态变量分配空间,创建方法表,常量表。静态变量分配默认值
(Optionally) Resolve,解决类中对其他class的引用的load。此过程何时执行,取决于虚拟机实现策略,可以在link阶段就递归执行,也可以留到使用到的时候再执行。
3. 初始化(Initialize)
静态变量的初始化,静态区的执行,在执行本类的initialize之前,必须完成父类的初始化
什么时候触发初始化:
- Tis a class and an instance ofTis created.
- Astaticmethod declared byTis invoked.
- Astaticfield declared byTis assigned.
- A static field declared by T is used and the field is not a constant variable
4. 实例化
1) 创建实例空间,包括父类的,变量赋给默认值
2) 递归初始化父类的成员,然后调用父类的构造函数
3) 初始化本类的成员,调用本类的构造函数。
5. finalize
垃圾回收时,类的finalize函数被垃圾回收线程调用,
6. 类卸载(unload)
只有当加载勒的加载器销毁之后,类才unload。一般不会用到。
7. 程序退出
System.exit().