类加载机制与类加载器

news2024/9/25 5:24:17

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

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.coloradmin.cn/o/806082.html

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

相关文章

音乐编曲软件FL Studio21中文免费版新功能及下载

FL Studio21是一款数字音频工作站软件,用于音乐制作和混音。它具有广泛的音频编辑和处理功能,可以帮助你创建出专业的音乐和音频内容。它还支持多个音频和效果轨道,可以帮助你创建更加复杂和高质量的音频内容。FL Studio是一款著名的DAW音频制…

1300*C. A Cookie for You

Example input 6 2 2 1 2 0 100 0 1 12 13 25 1 27 83 14 25 0 0 1 0 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 output Copy Yes No No Yes No Yes 解析: 因为第二种人只能吃少的那种蛋糕,所以优先满足他…

Flutter 开发者工具 Android Studio 开发Flutter应用

Flutter 开发者工具 在 Android Studio 开发Flutter应用 🔥 Android Studio 版本更新 🔥 Android Studio Check for Update Connection failed ​ 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…

spring boot 2 配置上传文件大小限制

一、起因:系统页面上传一个文件超过日志提示的文件最大100M的限制,需要更改配置文件 二、经过: 1、在本地代码中找到配置文件,修改相应数值后交给运维更新生产环境配置,但是运维说生产环境没有这行配置,遂…

Java那些“锁”事 - 死锁及排查

死锁是两个或者两个以上的线程在执行过程中,因争夺资源而造成的一种互斥等待现象,若没有外界干涉那么它们将无法推进下去。如果系统资源不足,进程的资源请求都得到满足,死锁出现的可能性就很低,否则就会因为争夺有限的…

kali安装Docker的方法+一次错误体验(第一行错误)

一.kali安装docker #添加docker的gpg密钥,签名用的 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -#添加docker的apt源 echo deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster sta…

使用Jetpack Compose和Motion Layout创建交互式UI

使用Jetpack Compose和Motion Layout创建交互式UI 通过阅读本博客,您将学会使用Motion Layout实现这种精致的动画效果: 让我们从简单的介绍开始。 介绍 作为Android开发者,您可能会遇到需要布局动画的情况,有时甚至需要变形样…

Linux安装kafka3.5.1

要在Ubuntu上安装Apache Kafka,请按照以下步骤操作: 1、安装Java运行时环境(Ubuntu): 如果已经安装jdk不用执行 sudo apt update sudo apt install default-jre2、下载Kafka: wget https://downloads.apache.org/kafka/3.5.1/…

Docker容器基本操作之启动-停止-重启

一、安装启动RabbitMQ容器 此处以rabbitmq容器为例 前提:需要安装配置好docker(设置镜像源、配置阿里云加速)、开启docker,停止(stop)或者禁用(disable)手动解压缩安装的rabbitmq,以防与docker中安装的rabbitmq冲突。 //查看docker状态 systemctl stat…

android Glide加载gif动图和本地视频,Java

droid Glide加载gif动图和本地视频,Java //从手机存储本地加载视频 String filePath "/storage/emulated/0/Pictures/my_video.mp4"; Glide .with( context ).load( Uri.fromFile( new File( filePath ) ) ).into( imageView );//加载gif Glide .with(…

用群晖NAS搭建个人音乐库

安装教程 勾选启动NTP服务 1. 群晖安装Audio Station 2. filestation会生成一个music文件夹,把下载好的音乐丢进music即可(音乐平台听不到的歌也顺带通过下载解决了)这时候你就可以在audio station直接听歌了不过咱们大部分时候听歌是在手机…

恒运资本:深市半年报预告规定?

依据深圳证券交易所等法律法规和业务规范的要求,应当及时、公平、精确发表成绩预告、成绩快报、中报、年度报告等信息。涉及中长期成绩情况的,还应当发表未来发展计划、运营战略、面对的风险与应战以及处理措施等中长期内容。 半年报成绩预告发表规则&am…

【PGMPY】 1. DAG基础结构

pgmpy 贝叶斯网络的纯python实现, 用途: 结构学习、 参数估计、 近似(基于采样) 精确推理 因果推理 安装 pip install pgmpyconda install -c ankurankan pgmpyconda install -c ankurankan pgmpy文档 https://pgmpy.org/index…

C++多线程编程(包含c++20内容)

C多线程编程(包含c20内容) 文章目录 C多线程编程(包含c20内容)线程通过函数指针创建线程通过函数对象创建线程通过lambda创建线程通过成员函数创建线程线程本地存储取消线程自动join线程从线程获得结果 原子操作库原子操作原子智能指针原子引用使用原子类型等待原子变量 互斥互…

Java【Spring】项目创建、存储和获取 Bean 的基本方式

文章目录 前言一、创建 Spring 项目1, 创建 Maven 项目2, 添加 Spring 依赖3, 创建启动类 二、存储 Bean 的基本方式1, 创建 Bean2, 存储 Bean 三、获取 Bean 的基本方式1, 获取上下文对象2, 获取 Bean3, 使用 Bean 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的…

tinkerCAD案例:18. Glow Circuit Assembly 发光电路组件

tinkerCAD案例:18. Glow Circuit Assembly 发光电路组件 In this tutorial, we’ll walk through how to use the Glow circuit assembly. 在本教程中,我们将演练如何使用 Glow 电路程序集。 Using the Glow circuit assembly, you’ll build a pengui…

使用Jetpack Glance创建Android Widget

使用Jetpack Glance创建Android Widget Jetpack Glance发布,让我们使用Google提供的Jetpack Glance创建一个联系人列表小部件。 https://developer.android.com/jetpack/compose/glance 什么是Glance? Jetpack Glance是一个使用Kotlin API创建小型、轻…

APP流量变现逻辑,流量变现收益如何最大化?

开发者首先通过买量的方式将用户引入APP中;用户在使用APP过程中的行为,诸如与游戏关卡的互动等,则不断地产生流量;最后,流量将成为“商品”,被运输至Facebook Audience Network或Google AdMob等平台进行售卖…

cmd命令查看电脑端口

操作是window系统的 其他系统原理类似 但也是有细微差别的 操作 netstat -na //135只是一个举例 netstat -ano | findstr 135//查看被占用端口对应的PID asklist | findstr 135//查看是哪个进程或者程序占用了端口指令 在Windows上: 使用以下命令查找占用指定…

Docker创建tomcat容器实例后无法访问(HTTP状态 404 - 未找到)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…