jvm类加载机制

本文详细介绍了Windows系统下Java类加载的过程,从.java.exe启动JVM,到类加载器的层级结构(引导类加载器、扩展类加载器、应用程序类加载器和自定义类加载器),以及类加载的步骤(加载、验证、准备、解析和初始化)。同时,探讨了类加载的双亲委派机制,并解释了每个阶段的具体任务,如验证字节码的正确性、给静态变量分配内存和初始化。文章还涵盖了方法区的组件和类的懒加载特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# windows系统下 .class 如何加载;

例如 com.alin.Math.class文件

1. jdk的由c++写的 java.exe执行文件调起jvm.dll文件创建java虚拟机;

2.创建一个引导类加载器实例;c++实现的

3.调用java代码创建jvm启动器实例:sun.misc.Launcher 该类由引导类加载器负责加载 并创建其他类加载器;

sun.misc.Launcher.getLauncher(),

4.然后获取运行类自己的加载器ClassLoader,是AppClassLoader的实例

5.调用loaderClass加载要运行的类 Math

classLoader.loaderClass("com.alin.Math")

6.加载完成后,jvm会执行Math类的main方法入口

#类加载过程:

 

加载->连接(验证、准备、解析)->初始化

加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载

加载:在硬盘上找到文件并通过io读入字节码文件,使用到类时才会加载,例如调用main()方法。在加载阶段会在内存中生成一个代表这个类的java.lang.Class文件。作为方法区这个类的各种数据的访问入口

验证:校验字节码文件的正确性:是否符合jvm指令码规范。

准备:给类的静态变量分配内存,并赋初值!int a = 2;  赋初值时 a值为0;

解析:将符号引用替换为直接引用。该阶段会把静态方法(符号引用,main,类名等)替换为指向数据所存内存地址的位置,此过程为静态链接过程。 而动态链接

初始化:对类的静态变量初始化为指定值,并执行静态代码块。 static int b=2;此阶段 b值为2;

类加载到方法区后,主要包含:运行时常量池,类型信息,字段信息,方法信息,类加载器引用,对应class实例引用,

jvm类加载实例 懒加载,使用到该类的时候才去加载

#类加载器和双亲委派机制

        引导类加载器:加载支持jvm运行的核心类库
        扩展类加载器:加载支持jvm运行的扩展jar包类
        应用程序类加载器:负责加载ClassPath下的类包,也就是我们自己实现的java文件
        自定义类加载器:加载用户自定义路径下的类包;

加载顺序:引导类加载器>扩展类加载器>应用程序类加载器>自定义类加载器

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值