快速构建JVM整体认知-JVM的生命周期
JVM的生命周期
JVM规范系列断断续续已经写了半年,最近结合一些小伙伴们的建议进行了一次复盘,决定在写法上进行一些演进优化:
这次我们从宏观视角梳理JVM的生命周期。这是我JVM系列文章中的其中一篇,相对宏观,其它部分主要讲解JVM规范的局部细节:字节码分析、面向JVM的编译、方法调用与异常处理的底层原理、控制流程、运行时内存区域、数据类型等应有尽有。

01 启动
一切始于main方法!JVM通过触发一个初始类的加载而启动,这个初始类中应当包含main方法。JVM会调用main方法从而驱动后续所有的执行。在JVM的实现中,可以通过命令行参数指定初始类,也可以通过设置一个类加载器来指定初始类。
02 加载

关于类加载,我们使用
What:加载什么?
加载的是用二进制形式表示的类,也就是编译后的字节码文件中的内容。
When:何时加载?
一个
Who:谁来加载?

负责加载工作的通常是类加载器,
类加载器有如下分类:
有一种特殊情况,当类型是数组时,将直接由虚拟机本身负责加载,数组中的组件类型依然由类加载器加载。
Where:加载到哪里去?
加载之后的类将会存放在
How:如何加载?
类加载器可以自己完成对一个类的加载,也可以委托其它类加载器来加载。由此,出现了以下两个概念:
这里涉及到另外一个问题:
03 链接

完整的
许多网文中提到:链接过程是解析符号引用,将其指向真实地址的过程。实际上这个
04 初始化

初始化过程就是执行类或接口的初始化方法(
因为JVM是多线程的,类或接口的初始化需要谨慎的同步(采用等待-通知机制)。因为其它线程可能同时尝试初始化相同的类或接口,还可能递归地请求类或接口的初始化,递归会作为类或接口初始化的一部分。
在初始化的过程中,
05 退出

JNI是一个标准的编程接口,用于编写Java本地方法并将JVM嵌入到本地应用中。例如使用C/C++编写的程序调用JVM。