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

Java虚拟机的类加载机制

Java虚拟机的类加载机制

  • 综述
  • 类的生命周期
  • 类加载器
  • 双亲委派模型
  • ---

综述

我们编写的Java代码如何能在一个操作系统上运行呢?一般来说,我们使用javac命令将.java文件编译成.class文件,也就是Java字节码文件,然后由JVM将字节码文件加载到JVM内存中,在运行时,一方面由解释器将字节码解释为一行行的机器码来执行,另一方面,由即时编译器针对热点代码,将其编译成机器码以获取更高的执行效率,解释器和即时编译器的相互配合使程序几乎能够达到和编译型语言一样的执行速度。其中JVM加载字节码的过程就是类加载。类加载的目的从高处看是为了将字节码文件转换成内存中某种形式的Class数据结构,程序可以通过这种数据结构构造出object,而这个过程是在运行时进行的,这也是Java动态扩展性的根基。从地处看,一个Java类从被加载到内存中开始,到卸载出内存为止,它将经历加载、验证、准备、解析、初始化、使用和卸载这七个阶段,其中验证、准备和解析可以统称为连接。而类加载只包括其中加载、连接和初始化这三个阶段。解析阶段是灵活的,可以在初始化阶段之前进行,也可以在初始化之后进行(动态绑定)。

类的生命周期

加载阶段是读取字节码文件,将其转化为某种静态数据结构存储在方法区中,并在堆中生成一个便于用户调用的java.lang.Class类型的对象的过程。

验证阶段是对字节码文件的规范校验,主要包括文件格式验证、元数据验证、字节码验证和符号引用验证。其中文件格式的验证是发生在加载阶段的,通过验证才能顺利加载。顺利加载后,方法区才有该类的数据结构,堆中也有该类的Class对象,但并不代表该类可以使用,还需要对该类的静态结构进行验证,包括元数据与字节码验证,主要是对其进行语法和语义分析,保证其不会产生危害虚拟机的行为,符号引用的验证发生在解析阶段。

准备阶段就是对类中定义的静态变量分配内存并初始化,在JDK8以前,hotspot使用永久代实现的方法区,所以类的元数据、常量池、静态变量等数据存放在永久代,而JDK8及以后,hotspot使用元空间实现了方法区,并将常量池和静态变量移到了堆上

解析阶段主要是将符号引用替换为直接引用,那么什么是符号引用,什么又是直接引用呢?我的理解是如果一个类A中引用了类B,但是B还没加载,那么A中对于B的引用在解析阶段之前是不知道B的地址的,所以A中会使用一个符号来代替B的地址,直到A进行到解析阶段,发现需要B的地址,由此触发B的加载,待到B加载完成之后,A中对B的引用符号会被B的真实地址所替换,那么那个替代符号就是指符号引用,后面真实地址则是指直接引用。而对于多态,B则可能是一个抽象类或接口,此时B的实现并不明确,那么其符号引用的替换则需要等到其运行调用时,虚拟机调用栈中会得到具体的类型信息,这时候再进行直接引用的替换,这就是动态解析,而前面就是静态解析。有时候解析发生在初始化阶段之后,这就是动态解析,用来实现后期绑定

初始化阶段是对类中的主动的资源初始化动作,也就是执行对静态变量和成员变量赋用户值以及静态代码块的逻辑

类加载器

在类加载过程中,用户主导的部分就是加载阶段获取二进制字节流部分和初始化阶段,其余部分全由JVM主导,则是符合开闭原则的。JVM规范中定义了两类类加载器:启动类加载器和其他类加载器,hotspot中则定义了四种类型的类加载器:C++实现的启动类加载器和Java实现的、继承自java.lang.ClassLoader的扩展类加载器、应用程序类加载器和用户自定义类加载器。其中启动类加载器无法作为对象被引用,用于加载lib下面的包,扩展类加载器用于加载lib/ext下的包,应用程序类加载器用于加载classpath下的包,用户自定义类加载器可以加载任意用户指定路径下的包

双亲委派模型

为什么要指定这么多类加载器呢?不能只有有一个吗?原则上可以只有一个的,但不太适合扩展,所以采用类似分类别类,对于系统需要的,则专门使用一个,而对于用户扩展的,则使用另一个或用户自己创建,这就解决了扩展性问题,但这又带来了一个新问题,那就是对于同一个限定名的类,不同类加载器会产生不同的类吗?设计者给出的解决方案是不同类加载器加载同一限定名的类会产生不同的类,因为xx,但是如果我想让它是同一个呢?这就要提到双亲委派模型了,双亲委派模型是指对于加载请求,子类会先委派给父类加载,如果父类不能加载,则再委派到子类加载,这里实现的方式是通过组合而非继承。越核心的类库会被越上层的类加载器所加载,而某限定名的类一旦被加载,在被动情况下,就不会再加载相同限定名的类了,这样就有效避免了加载的混乱。关于双亲委派模型的四次破坏:①是

类加载机制=类的生命周期+类加载器+双亲委派模型

机制是指系统中各要素相互作用的过程和方式,Java虚拟机的类加载机制是指被编译好的Java字节码(Class文件)在被加载到Java虚拟机内存中开始,到形成可被Java虚拟机直接使用的Java类型为止的整个过程和相关方式,所以要理解类加载机制,就不可避免的要谈到Java类的生命周期与双亲委派模型了。

一个Java类型从被加载到虚拟机内存中开始,到卸载出内存为止,它将经历加载、验证、准备、解析、初始化、使用和卸载这七个阶段,其中验证、准备和解析这三个阶段可以统称为连接。而类加载则包括指加载、连接和初始化这三个阶段。

在代码被编译器编译成字节码之后,由相应的类加载器开始加载字节码,首先会通过类的全限定名获取该类的二进制字节流,然后将这个二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构,并在内存中生成一个代表该类的java.lang.Class对象,作为该类各种数据的访问入口(加载阶段)。在获取到类的二进制字节流的同时,会进行文件格式、元数据、字节码和符号引用的验证,以确保该二进制字节流所包含的信息符合Java虚拟机的规范要求,保证被当作代码运行后不会危害到虚拟机自身的安全(验证阶段)。验证通过之后,会为类中定义的静态变量分配内存并初始化数值(准备阶段负责分配内存和赋缺省值,初始化阶段负责赋用户值)。同时,将常量池中的符号引用替换成直接引用(解析阶段)。然后用户就可以使用该类了(使用阶段、卸载阶段)。

参考:
《深入理解Java虚拟机(第三版)》

相关文章:

Java虚拟机的类加载机制

Java虚拟机的类加载机制综述类的生命周期类加载器双亲委派模型---综述 我们编写的Java代码如何能在一个操作系统上运行呢?一般来说,我们使用javac命令将.java文件编译成.class文件,也就是Java字节码文件,然后由JVM将字节码文件加…...

分治法实现合并排序(归并排序),理解分治算法思想,实现分治算法的完美例子合并排序(含码源与解析)

🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -…...

Typescript 类 (class)

基本用法 (通过关键字 class) // 基本用法 class VueService {constructor() {} // 构造器 } 类的约束(通过关键字 implements) // 接口定义属性类型 interface VueProps {name: stringinit: () > void }// 约束类 class VueService implements Vue…...

KDZD程控超低频高压发生器

一、产品概述 本产品接合了现代数字变频技术,采用微机控制,升压、降压、测量、保护自动化。由于电子化,所以体积小重量轻、大屏幕液晶显示,清晰直观、且能显示输出波形、打印试验报告。 设计指标符合《电力设备专用测试仪器通用…...

【华为OD机试 2023最新 】 过滤组合字符串(C++)

文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 数字0、1、2、3、4、5、6、7、8、9分别关联 a~z 26个英文字母。 0 关联 “a”,”b”,”c”1 关联 “d”,”e”,”f”2 关联 “g”,”h”,”i”3 关联 “j”,”k”,”l”4 关联 “m”,”n”,”o”5 关联 “p”,”q”…...

Java笔记034-坦克大战【2】

目录 坦克大战【2】 线程-应用到坦克大战 坦克大战0.3 思路分析: 代码实现: 坦克大战0.4 增加功能 特别说明 思路分析: 代码实现: 坦克大战0.5 增加功能 思路分析: 代码实现: 坦克大战【2】 …...

【算法】【数组与矩阵模块】桶排序思想解决无序数组排序后相邻数间的最大差值

目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介绍 …...

C语言—函数

函数库函数自定义函数函数的参数函数的调用函数的嵌套调用和链式访问函数的声明和定义函数递归递归与迭代函数递归的经典题目维基百科(台湾方面维护的,翻译形式跟大陆有所差异)中对函数的定义:子程序在计算机科学中,子…...

Autosar模式管理实战系列03-基于Davinci工具的WDGM配置

本文框架 前言1.WdgMConfigSet 配置2. 新建监控实体(SE)2.1 新建检测点(Checkpoint)2.2 设置 WdgMInternalTransitions3. WdgMLocalStatusParams配置4. WdgMAliveSupervision配置5. 代码插入指导前言 前面我们介绍了WdgM(看门狗管理)是一个 AutoSAR 的基础模块,负责管理看门…...

AutoML-sklearn and torch

一、auto-sklearn 1.1 环境依赖 额外安装swig 第三方库 linux 支持, mac,windows不支持 1.2 示例代码 time_left_for_this_task 设定任务最大时间 per_run_time_limit 每个子任务最大训练时间 include 可以限制任务训练的模型 import autosklearn.classific…...

《扬帆优配》算力概念股大爆发,主力资金大扫货

3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.01亿元、2.78亿元、2.37亿元。 今日三大指数团体收涨,收盘共34股涨停,首要集中于数字经济方向,其间云核算、CPO大迸发。除去5只ST股,算计2…...

机械臂+底盘三维模型从solidworks到moveit配置功能包

文章目录 导出底盘STEP加载机械臂模型组合机械臂和底盘三维模型导出URDF在moveit中进行配置新建工作目录设置ROS工作空间的环境变量进入moveit setup加载URDF文件self-CollisionsPlanning groupsRobot posesControllersSimulationAuthor information生成配置包在rviz中进行可视…...

高并发系统设计:缓存、降级、限流、(熔断)

高并发系统设计:缓存、降级、限流、(熔断) 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。 非核心服务可以采用降级、熔断,核心服务采用缓存和限流(隔离流量可以最大限度的保障业务无损)。 缓存 缓…...

《辉煌优配》放量大涨,A股成交额重回万亿!PCB板块继续领跑

多只绩优PCB概念股超跌。 今日A股放量反弹,成交额从头站上万亿关口。芯片板块掀涨停潮,景嘉微、芯原股份20cm涨停,紫光国微、兆易创新、跃岭股份等封板;AI算力、存储器、光模块、云核算等板块全线拉升,板块内个股再度批…...

Vue封装的过度与动画

动画效果 先把样式封装好&#xff0c;然后设置一个动画 不需要vue也能实现的动画的效果&#xff0c;我们只需要判断一下&#xff0c;然后动态的添加和删除类名即可 那能不能不自己写动态&#xff0c;就靠vue 首先我们要靠<transition>标签把需要动画的包裹起来 vue中…...

流量监控-ntopng

目录介绍安装使用介绍 ntopng是原始ntop的下一代版本&#xff0c;ntop是监视网络使用情况的网络流量探测器。ntopng基于libpcap&#xff0c;并且以可移植的方式编写&#xff0c;以便实际上可以在每个Unix平台&#xff0c;MacOSX和Windows上运行。 ntopng&#xff08;是的&…...

C++ 21 set容器

目录 一、set容器 1.1 简介 1.2 构造和赋值 1.3 大小和交换 1.4 插入和删除 1.5 查找和统计 1.6 set和multiset区别 1.7 内置类型指定排序规则 1.8 自定义数据类型指定排序规则 一、set容器 1.1 简介 ① set容器中所有元素在插入时自动被排序。 ② set容器和multise…...

什么是JWT

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案。 传统的session认证 http协议本身是一种无状态的协议&#xff0c;而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证&#xff0c;那么下一次请求时&#xff0c;用户还要再一…...

Gradle7.4安装

前置&#xff1a;本文基于IntelliJ IDEA 2022.2.1 、jdk1.8进行安装 目录 1.挑选Gradle版本 2.系统变量设置 1.挑选Gradle版本 gradle兼容性差&#xff0c; 1.跟idea会有版本问题。 2.跟springboot也有兼容问题Spring Boot Gradle Plugin Reference Guide 首先查询版本&…...

【华为OD机试 2023最新 】 箱子之字形摆放(C++ 100%)

文章目录 题目描述输入描述输出描述备注用例题目解析C++题目描述 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为: AFG BE CD …...

Matplotlib库入门

Matplotlib库的介绍 什么是Matplotlib库&#xff1f; Matplotlib是一个Python的数据可视化库&#xff0c;用于绘制各种类型的图表&#xff0c;包括线图、散点图、条形图、等高线图、3D图等等。它是一个非常强大和灵活的库&#xff0c;被广泛用于数据科学、机器学习、工程学、…...

学生党用什么蓝牙耳机比较好?300内高性价比蓝牙耳机排行

随着蓝牙技术的发展&#xff0c;蓝牙耳机越来越普及&#xff0c;不同价位、不同性能的蓝牙耳机数不胜数。那么&#xff0c;学生党用什么蓝牙耳机比较好&#xff1f;下面&#xff0c;我来给大家推荐几款三百内高性价比蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳…...

Lambda 表达式与函数式接口

函数式接口 如果一个接口&#xff0c;只有一个抽象方法&#xff0c;该接口即为函数式接口。函数式接口&#xff0c;即可使用 Lambda 表达式。 如下面的接口 public interface Translate {void translate();}目前该接口的抽象方法为无参数无返回值 Lambda 表达式 无参无返回值…...

后端代码规范

1、报文入参尽量避免使用实体类&#xff08;如果用实体类接受参数&#xff0c;一定要写好注解&#xff0c;具体用到了实体类的哪一个属性&#xff09; /*** * Description: 新增玉米观测记录主表信息* param param params* param return 参数* return Result 返回类型* author…...

web自动化测试:Selenium+Python基础方法封装(建议收藏)

01、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架构的自动化来说&#xff0c;B/S有着其无法忽视的诸多优势&#xff0c;从行业发展趋、研发模式特点、测试工具支持&…...

while实现1到100相加求和-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-7】while实现1到100相加求和 一、案例描述 考核知识点 while循环语句 练习目标 掌握while循环语句。 需求分析 1-100之间的数相加求和&#xff0c;本案例通过while循环语句来实现。 案例分析 效果如图2-10所示。1-100所有数的和 具体实现步骤如下&#xff1a; 在&l…...

Thingsboard(2.4 postgresql版)数据库表结构说明

本文描述的表结构是根据thingsboard2.4&#xff08;postgresql版&#xff09;数据库中整理出来的&#xff0c;不一定完整&#xff0c;后续有新的发现再补充文档。 一、数据库E-R关系 Thingsboard2.4社区版共22个表&#xff0c;主要包括实体信息表、关系信息表、字典表和系统配…...

IDS反病毒与APT的具体介绍

文章目录一&#xff0c;IDS1. 什么是IDS&#xff1f;2. IDS和防火墙有什么不同&#xff1f;3. IDS工作原理&#xff1f;4. IDS的主要检测方法有哪些详细说明&#xff1f;5. IDS的部署方式有哪些&#xff1f;6. IDS的签名是什么意思&#xff1f;签名过滤器有什么作用&#xff1f…...

while do..while验证用户名和密码-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-8】while do..while验证用户名和密码 一、案例描述 考核知识点 while、do…while循环语句 练习目标 掌握while语句。do…while循环语句。 需求分析 在网站上登录时会用到表单&#xff0c;让用户属于用户名和密码&#xff0c;输入正确才可以进入&#xff0c;本案例将…...

tmux常用操作指令

创建会话tmux new -s 会话名 恢复会话tmux at -t 会话名 tmux attach -t 会话名 杀死会话tmux kill-session -t 编号 tmux kill-session -t 会话名 查询会话tmux ls tmux list-session 划分窗格划分上下两个窗格&#xff1a; tmux split-window 划分左右两个窗格&#xff1a;…...