【01】能不能说说main方法的启动流程和类加载流程?

main方法启动流程

main方法启动流程

「main方法启动流程解释:」

  1. 先把文件编译成class文件
  2. 在window下,java.exe调用jvm.dll创建虚拟机,dll文件相当于jar包。
  3. c++创建引导类加载器。
  4. 实例化Launcher,由引导类加载器加载。
  5. 加载JvmTest.class文件
  6. 执行main方法

类加载流程,类是如何加载到java虚拟机的

类加载流程
类加载流程
static int a = 10;
int b = 5;

加载类到Java虚拟机(JVM)的过程可以分为以下几个步骤:

  1. 「加载」:将字节码文件加载到内存中。这可以通过类加载器(ClassLoader)来完成。类加载器负责查找字节码文件,并将其读取到JVM中的方法区(或称为元空间)。
  2. 「验证」:对加载的字节码文件进行验证,确保其符合Java虚拟机规范和安全要求。验证阶段会检查字节码文件的结构、语义、指令序列等方面,以确保代码的正确性和安全性。
  3. 「准备」:为类的静态变量分配内存并设置默认初始值。在准备阶段,静态变量被赋予默认的零值(如整数类型为0,引用类型为null)。
  4. 「解析」:将符号引用转换为直接引用。在解析阶段,虚拟机将符号引用(以符号形式表示的类、字段或方法)转换为直接引用(直接指向内存中的具体地址或偏移量)。静态方法、静态字段和一部分常量会在类加载的准备阶段进行解析。
  5. 「初始化」:为类的静态变量赋予真正的初始值,并执行静态初始化块(static blocks)中的代码。在初始化阶段,静态变量会被赋予程序中指定的初始值,静态初始化块中的代码会被执行。

注意:初始化阶段是类加载的最后一个阶段,只有当对类的主动使用时才会触发初始化。主动使用包括实例化对象、访问静态变量、调用静态方法等操作。

在代码示例中,变量a为静态变量,因此在初始化阶段会为其赋予初始值10。变量b为实例变量,需要在对象实例化时进行赋值。

Java面试技术栈
Java面试技术栈

「类的加载机制一般是懒加载,在只有用到的时候才会真正的加载。」

验证:

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类没有被使用,所以不会被加载。

Java面试技术栈
Java面试技术栈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值