main方法启动流程
「main方法启动流程解释:」
-
先把文件编译成class文件 -
在window下,java.exe调用jvm.dll创建虚拟机,dll文件相当于jar包。 -
c++创建引导类加载器。 -
实例化Launcher,由引导类加载器加载。 -
加载JvmTest.class文件 -
执行main方法
类加载流程,类是如何加载到java虚拟机的
static int a = 10;
int b = 5;
加载类到Java虚拟机(JVM)的过程可以分为以下几个步骤:
-
「加载」:将字节码文件加载到内存中。这可以通过类加载器(ClassLoader)来完成。类加载器负责查找字节码文件,并将其读取到JVM中的方法区(或称为元空间)。 -
「验证」:对加载的字节码文件进行验证,确保其符合Java虚拟机规范和安全要求。验证阶段会检查字节码文件的结构、语义、指令序列等方面,以确保代码的正确性和安全性。 -
「准备」:为类的静态变量分配内存并设置默认初始值。在准备阶段,静态变量被赋予默认的零值(如整数类型为0,引用类型为null)。 -
「解析」:将符号引用转换为直接引用。在解析阶段,虚拟机将符号引用(以符号形式表示的类、字段或方法)转换为直接引用(直接指向内存中的具体地址或偏移量)。静态方法、静态字段和一部分常量会在类加载的准备阶段进行解析。 -
「初始化」:为类的静态变量赋予真正的初始值,并执行静态初始化块(static blocks)中的代码。在初始化阶段,静态变量会被赋予程序中指定的初始值,静态初始化块中的代码会被执行。
注意:初始化阶段是类加载的最后一个阶段,只有当对类的主动使用时才会触发初始化。主动使用包括实例化对象、访问静态变量、调用静态方法等操作。
在代码示例中,变量a
为静态变量,因此在初始化阶段会为其赋予初始值10。变量b
为实例变量,需要在对象实例化时进行赋值。
「类的加载机制一般是懒加载,在只有用到的时候才会真正的加载。」
验证:
public class JvmTest {
static int b = 10;
static {
System.out.println("jvmTest静态方法");
System.out.println("b的值 = " + b);
}
public static void main(String[] args) {
System.out.println("执行main方法");
new A();
}
}
class A {
static {
System.out.println("A的静态方法");
}
A() {
System.out.println("A的构造方法");
}
}
class B {
static {
System.out.println("B的静态方法");
}
B(){
System.out.println("B的构造方法");
}
}
执行结果:
jvmTest静态方法
b的值 = 10
执行main方法
A的静态方法
A的构造方法
A类的静态代码块输出是在main方法之后,也就是在真正使用的时候才会被加载。然后B类没有被使用,所以不会被加载。