Main()如何启动的?
文章目录
|
|
main()方法被触发前,JVM需要做以下一些事情:
- load
- link
- initialize the class
load: 把对应类字节码加载进JVM中;
link: 链接包含所需的二进制类型的数据以便JVM使用。该环节包含3步:
1. verification
确保类(接口)结构类型正确;
2. preparation
涉及类(接口)的内存分配;
3. optional resolution
解决符号引用;
initialize the class:类中成员变量初始化;
加载工作是有类加载器来完成的。当JVM启动时,3个类加载器被使用:
- 启动类(Bootstrap class loader):加载java核心类库,即位于 /jre/lib 下的类。它们JVM的核心部分,用本地代码编写的。
- 扩展类(Extensions class loader):加载在扩展目录下的类。Eg:/jre/lib/ext
- 系统类(System class loader):加载 CLASSPATH 下的类。
因此,HelloWorld类将被系统类加载器来加载。当main()方法被执行时,它将触发它所依赖的那些类的load、link和initialize。
之后,main()栈帧被push进JVM栈中。PC(program counter) 根据情况设置。将 println()栈帧push进JVM栈中,当执行完成后,JVM栈将依次POP。