JVM类加载过程

JVM类加载分为5个过程:加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载

  • 加载:将.class文件(并不一定是.class。可以是ZIP包,网络中获取)中的二进制字节流读入到JVM中

  • 连接: 连接分三步: 验证 准备 解析

    1. 验证: 验证主要确保加载进来的字节流符合JVM规范
    2. 准备:为静态变量在方法区分配内存,并设置默认初始值!
    3. 解析:是虚拟机将常量池内的符号引用替换为直接引用的过程
  • 初始化:主要是根据程序中的赋值语句主动为类变量赋值,主动赋值语句
    通过一个简单案例了解加载过程

  • 案例一
class Singleton1 {
    private static Singleton1 singleton1 = new Singleton1();
    public static int value1;
    public static int value2 = 0;

    private Singleton1() {
        value1++;
        value2++;
    }

    public static Singleton1 getInstance() {
        return singleton1;
    }

}

public class ClassLoaderTest1 {
    public static void main(String[] args) {
        Singleton1 singleton1 = Singleton1.getInstance();
        System.out.println("Singleton1 value1:" + singleton1.value1);
        System.out.println("Singleton1 value2:" + singleton1.value2);
    }
}
  • 输出
    在这里插入图片描述

  • 原理:

    1 首先执行main中的Singleton singleton = Singleton.getInstance();
    2 类的加载:加载类Singleton
    3 类的验证
    4 类的准备:为静态变量分配内存,设置默认值。这里为singleton(引用类型)设置为null,value1,value2(基本数据类型)设置默认值0
    5 类的初始化(按照赋值语句进行修改):
    执行private static Singleton singleton = new Singleton();
    执行Singleton的构造器:value1++;value2++; 此时value1,value2均等于1
    执行
    public static int value1;
    public static int value2 = 0;
    此时value1=1,value2=0

  • 案例二
class Singleton2 {
    public static int value1;
    public static int value2 = 0;
    private static Singleton2 singleton2 = new Singleton2();

    private Singleton2() {
        value1++;
        value2++;
    }

    public static Singleton2 getInstance2() {
        return singleton2;
    }

}
public class ClassLoaderTest1 {
    public static void main(String[] args) {
        Singleton2 singleton2 = Singleton2.getInstance2();
        System.out.println("Singleton2 value1:" + singleton2.value1);
        System.out.println("Singleton2 value2:" + singleton2.value2);
    }
}
  • 输出

在这里插入图片描述

  • 原理

    1 首先执行main中的Singleton2 singleton2 = Singleton2.getInstance2();
    2 类的加载:加载类Singleton2
    3 类的验证
    4 类的准备:为静态变量分配内存,设置默认值。这里为value1,value2(基本数据类型)设置默认值0,singleton2(引用类型)设置为null,
    5 类的初始化(按照赋值语句进行修改):
    执行
    public static int value2 = 0;
    此时value2=0(value1不变,依然是0);
    执行
    private static Singleton singleton = new Singleton();
    执行Singleton2的构造器:value1++;value2++;
    此时value1,value2均等于1,即为最后结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmineWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值