当前位置: 首页 > web >正文

JVM——类加载器

目录

1.什么是类加载器

2.双亲委派模型

3.类装载的执行流程

3.1面试题


1.什么是类加载器

类加载器:用于装载字节码文件(.class文件)

JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来

类加载器的种类:

1.BootStrap ClassLoader(启动类加载器)

主要用来加载Java的核心类库的

load from JAVA_HOME/jre/lib

2.ExtClassLoader(扩展类加载器)

主要加载jdk下的扩展目录,加载这里边的jar包

load from JAVA_HOME/jre/lib/ext

3.AppClassLoader(应用类加载器)

加载开发者自己编写的java类

load from CLASSPATH

4.CustomizeClassLoader(自定义类加载器)

实现自定义类加载规则

2.双亲委派模型

加载某个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类

JVM为什么采用双亲委派机制

  • 通过双亲委派机制可以避免某个类被重复加载,当父类已经记载后则无需重复加载,保证唯一性
  • 为了安全保证类库API不会被修改

自己写的String类,执行main函数,就会出现异常在类java.lang.String中找不到main方法

原因:所有的核心类的加载请求都会被委派给启动类加载器,所以自己定义的String不会被加载,因为启动类加载器会优先加载JRE自带的标准类,从而防止对api的修改

3.类装载的执行流程

类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载,验证,准备,解析,初始化,使用和卸载这七个阶段。其中,验证,准备和解析这三个部分统称为连接(linking)

1.加载:

  • 通过类的全名,获取类的二进制数据流
  • 解析类的二进制数据流为方法区内的数据结构(Java类模型)
  • 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口

比如:

有一个person类,这个类被类加载器加载后存储到运行时数据区,在运行时数据区中有两块区域进行存储。

  • 方法区存储的是当前这个类的信息,person类的构造函数,方法,字段等
  • 在堆中会开辟一片空间存储当前类的class对象:后期我们创建对象的时候都是基于class对象创建,构造函数,方法,字段都需要通过方法区获得,class对象可以找到方法区中的person信息,获取类的数据结构来创建对象就好了

2.验证:

验证类是否符合JVM规范,安全性检查

3.准备:

为类变量分配内存并设置类变量初始值

类变量:通过static修饰的变量叫做类变量

4.解析:

把类的符号引用转换为直接引用

比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针指向方法。

5.初始化:

对类的静态变量,静态代码块执行和初始化操作

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

6.使用:

JVM开始从入口方法开始执行用户的程序代码

  • 调用静态成员信息(比如:静态字段,静态方法)
  • 使用new关键字为其创建对象的实例

7.卸载

3.1面试题

面试官:说一下类装载的执行流程?

我:总共分为了7个阶段

  • 加载:查找和导入class文件
  • 验证:保证加载类的准确性
  • 准备:为类变量分配内存并设置类变量初始值
  • 解析:把类中的符号引用转换成直接引用
  • 初始化:对类的静态变量,静态代码块执行初始化操作
  • 使用:JVM开始从入口方法开始执行用户的程序代码
  • 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象

http://www.xdnf.cn/news/7960.html

相关文章:

  • 【Python】总结像大模型一样一个字一个字输出的方法
  • Simon J.D. Prince《Understanding Deep Learning》
  • [TCG] QEMU TCG 概览
  • 【Python-Day 16】代码复用基石:详解 Python 函数的定义与调用
  • 台风灾害下考虑调节特性的多元资源紧急协调调度
  • 如何进行单表误删的恢复|OceanBases 运维实践
  • CMMI(能力成熟度模型集成)详解及5个级别案例
  • Qt多线程
  • 项目执行中缺乏风险管理,如何预防潜在问题?
  • 打破性能瓶颈:用DBB重参数化模块优化YOLOv8检测头
  • labview硬件部分——温度测量
  • ProtonBase 与您相约 AICon 上海站!
  • 【超长上下文检索评测】Qwen-Agent 智能体 vs 传统RAG vs 大上下文模型,谁更强?
  • Docker 镜像分层机制详解:UnionFS 如何实现高效存储与快速启动
  • jvm调优以及常见jvm问题解决等
  • idea无法识别Maven项目
  • LLaMA-Adapter
  • 使用MATLAB输出给定范围内的所有质数
  • Vue3 Element Plus el-table-column Sortable 排序失效
  • 多通道经颅直流电刺激器产品及解决方案特色解析
  • 告别手动绘图!2分钟用 AI 生成波士顿矩阵
  • 灾备认证助力构建数据资产安全防线‌
  • java中定时任务的实现及使用场景
  • NC028NQ472美光固态颗粒NQ484NQ485
  • MBSS-T1:基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping|文献速递-深度学习医疗AI最新文献
  • 超越现有SOTA!DiT模型助力高分辨率图像生成
  • 工业物联网网关在变电站远程监控中的安全传输解决方案
  • 车辆诊断技术全生命周期管理与实践
  • Elasticsearch简单集成java框架方式。
  • Python Lambda 表达式