文章目录
1
2
3
4
5
6
7
8
9
10
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World");
}
}

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。

文章目录