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().