类加载机制与类加载器

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

Java 源码是如何形成类文件的,类文件又是如何加载到虚拟机的,类加载有哪些机制和原则呢?本文将为大家一一介绍。

1

Java 源码形成类文件

1407ccd1c3a76827e4a00b04600f2290.png

1、Helloworld.java 形成 HelloWorld.class 的过程

package jvm;
public class HelloWorld {
public static void main(String[] args) {System.out.println("HelloWorld");}
}

编译操作:javac Helloworld.java ---> Helloworld.class

命令行编译(javac 命令)、运行(java 命令)效果图:

9b24237d3df40b5e6029b302a51eae37.png

查看类文件的字节码(javap 命令):

9087f05cb2fdd017935d5425c6c62c6a.png

HelloWorld.java 编译过程:

HelloWorld.java ---> 词法分析 ---> token 集合 ---> 语法分析 ---> 语法树/抽象语法树 ---> 语义分析 ---> 注解抽象语法树 ---> 字节码生成 ---> HelloWorld.class文件

2

类文件加载到虚拟机(类加载机制)

f07e29163c302b72f31518062a7c287b.png

1、类使用的生命周期

类从被加载到虚拟机内存中开始直到卸载出内存为止,它的整个生命周期包括 7 个阶段:加载、验证、准备、解析、初始化、使用和卸载。类加载主要是前 5 个阶段。

bb91d3dce0a138f836e90e5b8bbb4989.png

加载(Load):查找和导入 class 文件

链接(Link):包括验证、准备和解析三个阶段。

1. 验证(Verify):保证被加载类的正确性,包括文件格式验证,元数据验证(是否符合Java语法规范),字节码验证(确保不会危害虚拟机安全),符号引用验证等。

2. 准备(Prepare):为类的静态变量分配内存,并将其初始化为默认值。

3. 解析(Resolve):把类中的符号引用转换为直接引用,包括类或接口的解析,变量的解析等。

初始化(Initialize):是类加载过程的最后一步,对类的静态变量,静态代码块执行初始化操作。

3

类加载器以及类加载原则

79316ccb6b5bff3999b47e19e16ffdef.png

1、类加载器

6549f475e752765d18056bf6a351c316.png

启动类加载器(BootStrap ClassLoader):加载 jdk 的核心类库,启动类加载器 Java 代码获取不到

扩展类加载器(Extension ClassLoader):加载 jre/lib/ext 目录下的类

应用程序类加载器(App ClassLoader):加载自定义应用程序类和普通 jar 包

自定义类加载器(Custom ClassLoader):应用程序可以继承 java.lang.ClassLoader类的方式,重写它的 findClass 方法实现自己的类加载器,以满足一些特殊的要求,比如把自己的代码进行加密以防止反编译。

2、JVM 的类加载时机

1、创建类的实例,也就是new一个对象的时候

2、访问某个类或接口的静态变量,或者对该静态变量赋值的时候

3、调用类的静态方法

4、反射 Class.forName("jvm.HelloWorld")

3、JVM 的类加载机制

全盘负责机制:当一个类加载器负责加载某个类时,该类所依赖和引用的其他类也将由该类加载器负责加载,除非显示使用另外一个类加载器来加载。

双亲委派机制:双亲委派就是如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把 这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类的加载就成功返回,只有父类加载器无法完成加载时才自己去加载。双亲委派机制的优势是可以保证 Java 核心类库的类型安全,比如 Java中的 Object 类,它存放在 rt.jar 之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此 Object 在各种类加载环境中都是同一个类,也就是保证了用户不能自己定义 java.lang.Object 类的情况。

缓存机制:保证所有加载过的类都会被缓存,当程序中需要使用某个类时,类加载器先从缓存区中获取该类,只有当缓存区中不存在该类的对象时,系统才会读取该类对应的二进制数据,并将其转换成类对象,存入缓冲区中。这就是为什么修改了代码后,必须重新启动才会生效的原因。

4、类加载的原则

检查某个类是否已经加载的顺序是自底向上,从Custom ClassLoader 到 BootStrap ClassLoader 逐层检查,只要某个 Classloader 已加载,就视为已加载此类,保证此类只加载一次;类加载的顺序是自顶向下,也就是从上到下,由上层来逐层尝试加载类。

后面将为大家介绍运行时数据区的知识。

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

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

相关文章

基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量(解析法) 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

AI Chat 设计模式:10. 组合模式

本文是该系列的第八篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下组合模式A.1Q.2 好的,给我举一个组合模式的例子,使…

idea导入maven项目问题

问题产生原因: ①idea加载maven项目,如果网络不通畅,会在maven仓库中产生一个文件,如下图所示: ②当网络通畅时,在下载就会因为此文件导致无法下载正确的maven依赖 解决方案: ①打开maven仓库的根目录 ②…

ts中声明引入未使用的报错——解决方案

在编写ts项目的时候,经常会出现如下报错: 导入声明中的所有导入都未使用 这是因为导入的模块暂时没有使用,ts给的一个提示信息 解决方案: 在ts.config.json中 把noUnusedLocals 设置为false即可 {"compilerOptions"…

【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块4

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

【UE5 多人联机教程】03-创建游戏

效果 步骤 打开“UMG_MainMenu”,增加创建房间按钮的点击事件 添加如下节点 其中,“FUNL Fast Create Widget”是插件自带的函数节点,内容如下: “创建会话”节点指游戏成功创建一个会话后,游戏的其他实例即可发现&am…

微服务体系<1>

我们的微服务架构 我们的微服务架构和单体架构的区别 什么是微服务架构 微服务就是吧我们传统的单体服务分成 订单模块 库存模块 账户模块单体模块 是本地调用 从订单模块 调用到库存模块 再到账户模块 这三个模块都是调用的同一个数据库 这就是我们的单体架构微服务 就是…

Training-Time-Friendly Network for Real-Time Object Detection 论文学习

1. 解决了什么问题? 目前的目标检测器很少能做到快速训练、快速推理,并同时保持准确率。直觉上,推理越快的检测器应该训练也很快,但大多数的实时检测器反而需要更长的训练时间。准确率高的检测器大致可分为两类:推理时…

银河麒麟安装mysql数据库(mariadb)-银河麒麟安装JDK-银河麒麟安装nginx(附安装包)

银河麒麟离线全套安装教程(手把手教程) 1.银河麒麟服务器系统安装mysql数据库(mariadb) 2.银河麒麟桌面系统安装mysql数据库(mariadb) 3.银河麒麟服务器系统安装JDK 4.银河麒麟桌面系统安装JDK 5.银河麒麟…

青大数据结构【2021】

一、单选(17!) 根据中序遍历得到降序序列可以知道,每个结点的左子树的结点的值比该结点的值小,因为没有重复的关键字,所以拥有最大值的结点没有左子树。 二、简答 三、分析计算 四、算法分析 3.迪杰斯特拉…

windows安装Elasticsearch8.9.0

官网解压安装好路径(非中文,无空格) 可参考 言之有李LAX csdn http://t.csdn.cn/S2oju本人使用jdk17 修改配置elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl:enabled: false直接点击bin\elasticsearch.bat…

Unity 工具之 NuGetForUnity 包管理器,方便在 Unity 中的进行包管理的简单使用

Unity 工具之 NuGetForUnity 包管理器,方便在 Unity 中的进行包管理的简单使用 目录 Unity 工具之 NuGetForUnity 包管理器,方便在 Unity 中的进行包管理的简单使用 一、简单介绍 二、NuGetForUnity 的下载导入 Unity 三、NuGetForUnity 在 Unity 的…

LeetCode 75 第十二题(11)盛最多水的容器

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 配合着示例给出的图片我们可以得知找出盛水最多的容器是什么意思,给一个数组,找出数组中两个元素能围成的最大的矩阵面积是多少. 比较直观的想法是套两层for循环暴力解出来,但是这题是中等难度题,一般中等题是没法用暴力得…

pinia在vue3中的使用

总结: 在store文件夹中建一个pinia的文件userStore.js 1.要想使用pinia必须先引入defineStore 这里我们使用es6的模块化语法导出的 import { defineStore } from pinia 2.然后使用export const useUserStore defineStore(user,{}) defineStore 方法有两个参数&…

论文分享:PowerTCP: Pushing the Performance Limits of Datacenter Networks

1 原论文的题目(中英文)、题目中包含了哪些关键词?这些关键词的相关知识分别是什么? 题目:PowerTCP: Pushing the Performance Limits of Datacenter Networks PowerTCP:逼近数据中心的网络性能极限 2 论…

vue+Element项目中v-for循环+表单验证

如果在Form 表单里有通过v-for动态生成&#xff0c;如何设置验证呢&#xff1f; <el-form ref"ruleFormRef" :model"ruleForm" status-icon :rules"rules" label-width"120px"class"demo-ruleForm" hide-required-aster…

在EF Core中为数据表按列加密存储

假设有User表 public class User : Entity<int> {public int Id { get; set; }public string UserName { get; set; }public string Name { get; set; }public string IdentificationNumber { get; set; } }其中有身份证号码IdentificationNumber列&#xff0c;需要加密…

虚拟机(VMware)安装Linux(Ubuntu)安装教程

清华大学开源网站镜像站网址&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 进入之后在搜索框中搜索“ubuntu” 直接点击箭头所指的蓝色字体“ubuntu-20.04.1-desktop-amd64.iso”即可下载

[Ubuntu 22.04] containerd配置HTTP方式拉取私仓Harbor

文章目录 1. 基础环境配置2. Docker安装3. 部署Harbor&#xff0c;HTTP访问4. 部署ContainerD5. 修改docker配置文件&#xff0c;向harbor中推入镜像6. 配置containerd6.1. 拉取镜像验证6.2. 推送镜像验证 1. 基础环境配置 [Ubuntu 22.04] 安装K8S基础环境准备脚本 2. Docker安…

听说 Spring Bean 的创建还有一条捷径?

文章目录 1. resolveBeforeInstantiation1.1 applyBeanPostProcessorsBeforeInstantiation1.2 applyBeanPostProcessorsAfterInitialization1.3 案例 2. 源码实践2.1 切面 Bean2.2 普通 Bean 在 Spring Bean 的创建方法中&#xff0c;有如下一段代码&#xff1a; AbstractAutow…