JVM工作过程

本文详细介绍了JVM的工作过程,主要包括类加载机制、类加载时机、类加载器的分类及其职责,尤其是重点讨论了双亲委派模型的运作流程。在类加载过程中,验证、准备和解析是必不可少的步骤,涉及到类变量的内存分配和符号引用的转换。
摘要由CSDN通过智能技术生成

一、类加载机制

jvm被划分为三个主要的子系统:类装载子系统(Class Loader Subsystem)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine)

二、类加载时机

虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行“初始化”(class文件加载到JVM中)
主动初始化的6种方式:
1.创建对象实例:new对象时,会对类进行初始化
2.调用类的静态属性或为静态属性赋值
3.调用类的静态方法
4.通过.class文件反射创建对象
5.初始化一个类的子类:使用子类时先初始化父类
6.Java虚拟机启动时被标记为启动类的类,如main方法所在类
不会初始化的情况:
1.在同一个类加载器下面只能初始化类一次
2.在编译时能确定下来的静态变量,如:final修饰的静态变量

三、类加载器

1.启动类加载器(Bootstrap ClassLoader):
负责加载JAVA_HOME中jre/lib/rt.jar里所有的class.由C++实现,不是ClassLoader子类
2.扩展类加载器(Ext ClassLoader):
负责加载jar包,包括JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
3.应用类加载器(App ClassLoader):
负责加载classpath中指定的jar包及目录中的class
4.自定义类加载器(User ClassLoader):
<1>根据路径找到字节码文件findClass方法;
<2>采用双亲委派模型加载loadClass方法;
<3>加载字节码文件生成对应的Class对象

四、双亲委派模型

在这里插入图片描述双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应该有自己的父类加载器
工作过程如下:
1.当前类加载器从自己已经加载的类中查询此类是否已经加载,如果已经加载则返回原来的类。
2.如果没有找到,就委托父类加载器加载,父类加载器也采用同样的策略,查看自己已经加载过的类中是否包含这个类,有就返回,没有就委托父类去加载,直到委托到启动类加载器为止。如果因为父类加载器为空了,就代表使用类加载器作为父类加载器去加载该类。
3.如果启动类加载器加载失败,就使用扩展类加载器尝试加载,继续失败就使用App ClassLoader加载,继续失败则抛出异常ClassNotFoundException

五、类加载详细过程

在这里插入图片描述链接阶段:
1.验证:文件格式验证,本次版本号
2.准备:准备阶段是正式为类变量分配内存并设置类变量初始化值的阶段,这些变量所使用的内存都将在方法区中进行分配。count在方法区分配4字节内存并赋类型默认值0
3.解析:将符号引用改为直接引用的过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值