JVM虚拟机系统性学习-类加载子系统

类加载子系统

类加载的时机

类加载的时机主要有 4 个:

  • 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时,如果对应的类没有初始化,则要先进行初始化
    • new 关键字创建对象时
    • 读取或设置一个类型的静态字段时(被 final 修饰、已在编译器将结果放入常量池的静态类型字段除外)
    • 调用一个类型的静态方法的时候
  • 对类进行 反射调用
  • 初始化一个类的时候,如果其父类未初始化,要先初始化其父类
  • 虚拟机启动时,要先加载主类(程序入口)

类加载过程

类的生命周期如下图:

在这里插入图片描述

  • 加载

    1. 通过二进制字节流加载 class 文件
    2. 创建该 class 文件在方法区的运行时数据结构
    3. 创建字节码对象 Class 对象
  • 链接

    1. 验证:目的在于确保 class 文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性

      主要包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证

    2. 准备:为类变量(即静态变量)分配内存并且设置类变量的默认初始值,即零值。

      这里不包含用 final 修饰的 static 变量,因为 final 修饰的变量在编译为 class 字节码文件的时候就会分配了,准备阶段会显式初始化

      这里不会为实例变量分配初始化,类变量会分配在方法区,而实例变量是会随着对象一起分配到 Java 堆中

    3. 解析:将常量池内的符号引用转换为直接引用的过程

      事实上,解析操作往往会伴随着 JVM 在执行完初始化之后再执行

      符号引用就是一组符号来描述所引用的莫表。符号引用的字面量形式明确定义在《java虚拟机规范》的Class 文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

      解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。

  • 初始化

    虚拟机在初始化阶段才真正开始执行类中编写的 Java 程序代码

    初始化阶段就是执行类构造器 <clinit>() 方法的过程,<clinit>() 是 Javac 编译器自动生成的,该方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并生成的,如果一个类中没有静态代码块, 也没有变量赋值的动作,那么编译器可以不为这个类生成 <clinit>() 方法

类加载器

JVM 中类加载是通过类加载器来完成的

在这里插入图片描述

  • 启动类加载器(Bootstrap ClassLoader):
    • 负责加载 JAVA_HOME\lib 目录中的,或通过 -Xbootclasspath 参数指定路径中的,且被虚拟机认可(按文件名识别,如rt.jar)的类。由 C++ 实现,不是 ClassLoade r的子类
  • 扩展类加载器(Extension ClassLoader):
    • 负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类库。
  • 应用程序类加载器(Application ClassLoader):
    • 负责加载用户路径 classpath 上的类库
  • 自定义类加载器(User ClassLoader):
    • 作用:JVM自带的三个加载器只能加载指定路径下的类字节码,如果某些情况下,我们需要加载应用程序之外的类文件,就需要用到自定义类加载器

双亲委派机制

加载类的class文件时,Java虚拟机采用的是双亲委派机制,即把请求交给父类加载器去加载

工作原理:

  1. 如果一个类加载器收到了类加载请求,他并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
  2. 如果父类加载器也存在其父类加载器,则继续向上委托
  3. 如果父类加载器可以完成类加载任务,就成功返回;如果父类加载器无法完成类加载任务,则会由自家在其尝试自己去加载

优势:

  1. 避免类的重复加载
  2. 保护程序安全,防止核心API被篡改(例如,如果我们自定义一个java.lang.String类,然后我们去new String(),我们会发现创建的是jdk自带的String类,而不是我们自己创建的String类)

为什么还需要破坏双亲委派?

  • 在实际应用中,可能存在 JDK 的基础类需要调用用户代码,例如:SPI 就打破双亲委派模式(打破双亲委派意味着上级委托下级加载器去加载类)
    • 比如,数据库的驱动,Driver 接口定义在 JDK 中,但是其实现由各个数据库的服务上提供,由系统类加载器进行加载,此时就需要 启动类加载器 委托子类加载器去加载 Driver 接口的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/264997.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[AutoSar]一种ECU间CAN通信的优化方法

目录 关键词平台说明一、背景二、问题现象三、原因四、解决办法五、实现5.1 配置5.2 code 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商EB芯片厂商英飞凌 TC397编程语言C&#xff0c;C编译器TASKING 一、背景 在一个项目中&#xff0c;会从多个…

学习 NVIDIA Omniverse 的最基础概念

无用的前言 近两年关于 Omniverse 的宣传一直很多&#xff0c;可我一直没去了解&#xff0c;连它是个啥都不知道。最近正好有契机需要了解它&#xff0c;于是我今天抽时间看了些它的官方介绍&#xff0c;并按照自己的理解梳理在这里。 官方资料索引 Omniverse 官网主页&…

向IDEA导入SpringBoot项目如何运行

解析项目 拿到项目之后&#xff0c;先分析分析。一般都有.md文件指导你&#xff0c;给你说用什么语言&#xff0c;工具&#xff0c;jdk版本&#xff0c;数据库版本&#xff0c;有没有maven。如果没有就直接将项目导入idea. 1.配置maven,没有maven请看https://blog.csdn.net/m0_…

TTS | emotional-vits情绪语音合成的实现

本文主要介绍了情绪语音合成项目训练自己的数据集的实现过程~ innnky/emotional-vits: 无需情感标注的情感可控语音合成模型&#xff0c;基于VITS (github.com) 目录 0.环境设置 1.数据预处理 2..提取情绪 3.训练 4.推理 过程中遇到的问题与解决【PS】 0.环境设置 因为我…

mysql为什么不推荐使用uuid或者雪花id作为主键

1 前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一&#xff0c;单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处&#xff1f; 本文我们就来分析这个问题,探讨…

机器视觉 齿轮检测

案例:齿轮内径检测 1.使用模板匹配 2.设置匹配区域 3.使用掩膜不必要的干扰 &#xff08;保留两个内径的圆形&#xff09; 1.添加找圆工具 2.添加模板匹配中心坐标 3.给外圈圆添加找圆工具 RunParams.ExpectedCircularArc.CenterX RunParams.ExpectedCircularArc.Cente…

(04730)电路分析基础之正弦交流电路(一)

正弦交流电概述 我们在前面已讨论了直流电路的分析&#xff0c;在直流电路中电压或电流的大小和方向都是不随时间而变化的&#xff1b;但在交流电路中&#xff0c;电压或电流的大小和方向都在随时间而变化&#xff0c;其变化规律多种多样&#xff0c;应用得最普遍的是按正弦规…

全志H6-ARMLinux第1天:全志概述、刷机登陆、官方外设库、蜂鸣器、超声波测距

1. 全志H616课程概述&#xff08;456.01&#xff09; 1.1 为什么学 学习目标依然是Linux系统&#xff0c;平台是ARM架构 蜂巢快递柜&#xff0c;配送机器人&#xff0c;这些应用场景用 C51、STM32 单片机无法实现第三方介入库的局限性&#xff0c;比如刷脸支付和公交车收费设…

#HarmonyOS:装饰器UI描述---@Link

装饰器 装饰器&#xff08;Decorator&#xff09;是一种语法结构&#xff0c;用来在定义时修改类&#xff08;class&#xff09;的行为。 在语法上&#xff0c;装饰器有如下几个特征。 第一个是字符&#xff08;或者说前缀&#xff09;是&#xff0c;后面是一个表达式后面的…

vscode eide arm-gcc 编译环境搭建调试

安装cube&#xff0c;vscode 1.安装vscode插件 C/C Extension Pack Chinese (Simplified) (简体中文) Language Pack Cortex-Debug Embedded IDE 工具链设置 2.软件工程生成 调试 3.生成工程&#xff0c;导入工程 4. 配置工程 编译完毕

【LeetCode刷题-树】-- 99.恢复二叉树

99.恢复二叉树 方法&#xff1a; 对二叉搜索树进行中序遍历得到值序列不满足的位置找到对应被错误交换的节点记为x和y交换x和y两个节点 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* Tre…

一拎即走的轻薄云台投影,极米投影仪Z7X解锁观影新姿势

近年来&#xff0c;随着投影技术的不断提高以及大屏幕带来的加倍快乐&#xff0c;让投影仪成为了一种新的观影潮流。尤其是“去客厅化”的大背景下&#xff0c;年轻人几乎将目光都投向了投影仪&#xff0c;从而实现在家就能享受大屏观影的效果和体验。那么备受当下年轻消费者青…