类加载机制与类加载器

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

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 已加载,就视为已加载此类,保证此类只加载一次;类加载的顺序是自顶向下,也就是从上到下,由上层来逐层尝试加载类。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.Flink概述

1.1 技术架构 应用框架层: 在API层之上构建的满足特定应用场景的计算框架,总体上分为流计算和批处理两类应用框架。API 层: Flink对外提供能力的接口 ,实现了面向流计算的DataStream API和面向批处理的DataSet API。运行时层:Flin…

No Spring环境Mybatis-Plus批量插入并返回主键的两种方式

批量插入,可以把Mybatis-Plus看作是Mybatis加强版;故Mybatis中的相关操作都可以在Mybatis-Plus中使用;在mysql数据库中支持批量插入,所以只要配置useGeneratedKeys和keyProperty就可以批量插入并返回主键了。 下面是批量插入的Dao层接口 一注解方式: 直接撸代码:…

SpringBoot —程序包org.springframework.boot.test.context不存在

一. 遇到问题 &#xff1a;程序包org.springframework.boot.test.context不存在 发生错误的原因是项目中缺少spring-boot-starter-test依赖导致的&#xff0c;解决方案如下: 在项目根目录的pom.xm文件中的<dependencies>节点下增加以下依赖即可&#xff1a; <depen…

网上办理的三网低月租大流量,到底能不能选归属地?

网上办理的三网低月租大流量&#xff0c;到底能不能选归属地&#xff1f; 首先&#xff0c;小编就明确地告诉大家&#xff0c;如果默认的是归属地随机&#xff0c;那么是不可以选择归属地的。 看到这里&#xff0c;可能有人会有疑问&#xff0c;网上的流量卡也是运营商推出的…

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)

系列文章目录 编程小白的自学笔记十一&#xff08;python爬虫入门三Selenium的使用实例详解&#xff09; 编程小白的自学笔记十&#xff08;python爬虫入门二实例代码详解&#xff09; 编程小白的自学笔记九&#xff08;python爬虫入门代码详解&#xff09; 目录 系列文章…

【Python】Web学习笔记_flask(1)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

Electron逆向调试

复杂程序处理方式&#xff1a; 复杂方式通过 调用窗口 添加命令行参数 启动允许调用&#xff0c;就可以实现调试发布环境的electron程序。 断点调试分析程序的走向&#xff0c;程序基本上会有混淆代码处理&#xff0c; 需要调整代码格式&#xff0c;处理程序。

32.选择器

选择器 html部分 <div class"toggle-container"><input type"checkbox" id"good" class"toggle"><label for"good" class"label"><div class"ball"></div></label&…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

flutter 导出iOS问题2

问题1:The Swift pod FirebaseCoreInternal depends upon GoogleUtilities, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries) 参考 正如上图报错第三方…

Mybatis中where 1=1 浅析

在一些集成mybatis的工程中经常看到where11 的代码&#xff0c;也有同事问我&#xff0c;这样写有什么用&#xff0c;下面对其进行简单的分析记录一下。 1、场景 看下面这样一段xml中的代码 <select id"queryBook" parameterType"com.platform.entity.Book…

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理

k8s webhook实例&#xff0c;java springboot程序实现 对Pod创建请求添加边车容器 &#xff0c;模拟istio实现日志文件清理 大纲 背景与原理实现流程开发部署my-docker-demo-sp-user服务模拟业务项目开发部署my-sidecar服务模拟边车程序开发部署服务my-docker-demo-k8s-opera…

Django快速上手

Django简介 Django 框架最初的诞生&#xff0c;主要是用来开发和管理 Lawrence Publishing Group&#xff08;劳伦斯出版集团&#xff09;旗下新闻网站的一款软件&#xff0c;是一款属于 CMS&#xff08;Content Management System&#xff0c;内容管理系统&#xff09;类的软…

面试典中典之线程池的七大参数

文章目录 一、七大元素解释1.corePoolSize&#xff08;核心线程数&#xff09;&#xff1a;2.maximumPoolSize&#xff08;最大线程数&#xff09;&#xff1a;3.keepAliveTime&#xff08;线程空闲时间&#xff09;&#xff1a;4.unit&#xff08;时间单位&#xff09;&#x…

Python 进阶(六):文件读写(I/O)

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 1. 打开文件2. 读取文件2.1 逐行读取文件2.2 读取所有行 3. 写入文件3.1 向文件中写入…

开放麒麟1.0发布一个月后,到底怎么样?另一款操作系统引发热议

具有里程碑意义 7月5日&#xff0c;国产首个开源桌面操作系统“开放麒麟1.0”正式发布。 标志着我国拥有了操作系统组件自主选型、操作系统独立构建的能力&#xff0c;填补了我国在这一领域的空白。 举国欢庆&#xff0c;算的上是里程碑意义了&#xff01; 发布后用着如何&a…

回归预测 | MATLAB实现WOA-ELM鲸鱼算法优化极限学习机多输入单输出回归预测

回归预测 | MATLAB实现WOA-ELM鲸鱼算法优化极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-ELM鲸鱼算法优化极限学习机多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现WOA-ELM鲸鱼算法优化极限学习机多输入回归预测&#…

2.获取DOM元素

获取DOM元素就是利用JS选择页面中的标签元素 2.1 根据CSS选择器来获取DOM元素(重点) 2.1.1选择匹配的第一个元素 语法: document.querySelector( css选择器 )参数: 包含一个或多个有效的CSS选择器 字符串 返回值: CSS选择器匹配的第一个元素&#xff0c;一个HTMLElement对象…

分享一个赛车动画

先看效果&#xff08;动画太大了放不上来&#xff0c;甘心去复制代码运行即可&#xff09;&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>赛车</title><…

一些网络知识总结(自用)

一些网络知识总结&#xff08;自用&#xff09; 1. 进制的转换 所有进制转换成十进制就是把字面值*权数 比如16进制 5AEF 转成10机制话就是 1* 151614321064 * 5 2. ip地址网段的概念&#xff0c;可用ip&#xff0c;广播地址 比如一个ip为10.1.1.1/24那么他的网络号就是前…