一文读懂Java类加载全过程,面试必备!

news2024/11/15 11:52:09

1、概述

Java类加载过程是Java虚拟机(JVM)将.class文件中的字节码装载到内存中,并对字节码进行验证、准备和初始化的过程。这个过程涉及到了Java虚拟机的类加载器、运行时数据区等多个方面,其中包含了很多的细节和技术问题。

  1. 类加载器

Java虚拟机的类加载过程是由类加载器(ClassLoader)来实现的。类加载器负责将类装载到内存中,并为其创建一个Class对象。Java虚拟机定义了三种类加载器,分别为Bootstrap ClassLoader、Extension ClassLoader、System ClassLoader,它们按照层次关系进行组织,而且每个类加载器都有自己独立的命名空间,保证了不同类加载器之间的隔离性。

2. 加载阶段

类加载过程的第一阶段是加载(Loading),即通过类加载器读取.class文件中的二进制字节流,并将其转换成Java虚拟机中的Class对象。在这个阶段,Java虚拟机将会检查类文件的格式、语义等内容,确保其符合Java规范,否则将抛出ClassFormatError等异常。

3. 验证阶段

在加载完成后,Java虚拟机会对类进行验证(Verification),以确保它的字节码是正确、安全且符合规范的。这个阶段主要有四种验证方式:文件格式验证、元数据验证、字节码验证和符号引用验证。

4. 准备阶段

在验证通过后,Java虚拟机会为类分配内存空间,并进行默认初始化(Prepare),即将类变量分配内存并初始化为二进制零值。这个过程中不会涉及任何Java代码执行,只是简单地为类变量赋予一些初始值。

5. 解析阶段

解析(Resolution)是Java虚拟机将符号引用替换为直接引用的过程。在Java程序中,调用方法或访问对象时通常使用符号引用,需要在运行时将其解析成直接引用才能执行相应的操作。

6. 初始化阶段

当类被加载并初始化后,Java虚拟机会执行其静态初始化器(clinit)中的Java代码。静态初始化器包含了对类中所有静态变量进行赋值操作的Java代码块,它们按照类定义时的顺序依次执行。如果在静态初始化器中发生异常,则该类将被视为无法正确初始化,不允许被使用。

类加载过程总结

Java类加载过程是一个复杂的过程,它涉及到类加载器、运行时数据区等多个方面,并且在不同的阶段都需要完成各种任务,如文件格式验证、元数据验证、符号引用解析等。了解这些过程可以帮助Java开发者更好地理解Java虚拟机的内部实现机制,从而编写出更加高效和优秀的Java代码。

2、相关问题

Q: 什么是类加载?

A: 类加载是将Java字节码文件加载到JVM中,并在运行期间动态生成Java类的过程。

Q: Java中有哪些类加载器?

A: Java中有三种类加载器:Bootstrap ClassLoader()、Extension ClassLoader和Application ClassLoader。

1)Bootstrap ClassLoader(启动类加载器):由C++编写,负责加载Java运行环境(JRE)核心库,例如java.lang包等。它是JVM的内置类加载器,在JVM启动时就会被初始化。

2)Extension ClassLoader(扩展类加载器):用来加载Java扩展库,位于JRE的/lib/ext目录下,或者通过java.ext.dirs系统变量指定的其他目录中。

3)Application ClassLoader(应用程序类加载器):用来加载应用程序路径上的类,也称为系统类加载器。它是ClassLoader类的子类,通常是由Java应用程序创建的默认类加载器。

Q: 类加载的过程包括哪些步骤?

A: 类加载的过程包括加载、验证、准备、解析和初始化五个步骤。

Q: 类加载器的双亲委派模型是什么?

A: 类加载器的双亲委派模型是指当一个类加载器需要加载一个类时,它首先会将这个任务委托给它的父类加载器去完成,如果父类加载器无法加载,则再由自己来尝试加载。

Q: 什么是类加载器的命名空间?

A: 类加载器的命名空间是指每个类加载器所加载的类都拥有独立的命名空间,相同名称的类可以存在于不同的命名空间中。

Q: 如何打破类加载器的双亲委派模型?

A: 可以使用线程上下文类加载器(Thread Context ClassLoader)来打破类加载器的双亲委派模型。

Q: 类加载器的缓存机制是什么?

A: 类加载器的缓存机制是指当一个类被某个类加载器加载后,该类及其依赖的类将被缓存到该类加载器中,以供后续使用。

Q: 如何自定义类加载器?

A: 可以通过继承ClassLoader类并重写findClass()方法来自定义类加载器。通常情况下,自定义类加载器会从指定的路径或者网络地址上加载字节码文件。

Q: 什么是热部署(HotSwap)?怎样实现Java代码的热部署?

A: 热部署是指在不停止Java应用程序的情况下,动态地替换或更新Java类或资源文件。实现Java代码的热部署可以使用一些工具,如JRebel、DCEVM等。这些工具通常通过改变类加载器的行为,使得修改后的Java类能够被重新加载到JVM中。

作者:玄明Hanko
链接:https://juejin.cn/post/7221396616581791802/
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

前端开发神器bootstrap介绍

想必刚开始学习前端的小伙伴在为设计优美的前端页面很苦恼吧,心中有好的比较不错的UI样式却无法绘制出来,学习呢又可能会有点困难,其实前端是很容易并不难学的,在前端设计上也有很多的开源库的,这些第三方的开源库已经…

12、视图解析器与模板引擎

文章目录1、视图解析1.1 spring boot支持的第三方模板引擎技术1.2、视图解析原理流程2、模板引擎-Thymeleaf2.1、thymeleaf简介2.2、基本语法1、表达式2、字面量3、文本操作4、数学运算5、布尔运算6、比较运算7、条件运算8、特殊操作2.3、设置属性值-th:attr2.4、迭代2.5、条件…

【数据结构】顺序表(上)

所属专栏:初始数据结构 博主首页:初阳785 代码托管:chuyang785> 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力,创作出更优质的博文!&#x…

(十六)排序算法-桶排序

1 基本介绍 1.1 概述 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)&a…

ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

碎碎念:好久不见,甚是想念!本期带来的是有关ZYNQ7020的内容,我们知道ZYNQ作为一款具有硬核的SOC,PS端很强大,可以更加便捷地实现一些算法验证。本文具体讲解一下里面的TTC定时器,之后发布的Part…

Java-初识 .class 文件

一、概述 class文件全名称为 Java class 文件,主要在平台无关性和网络移动性方面使 Java 更适合网络。该文件打破了 C 或者 C 等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系…

面试被问到vue的diff算法原理,我不允许你回答不上来

一、是什么 diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行, 不会跨层级比较在diff比较的过程中,循环从两边向中间比较 diff 算法在很多场景下都有应用,在 vue 中,作用于虚拟 dom 渲…

nvm实现多版本node自由切换

nvm,全称是node.js version management,可以在多个node版本之间自由切换! 1、下载文件 github Releases coreybutler/nvm-windows GitHub 2、安装nvm 注意:安装前必须完全卸载node 彻底从Windows中删除Node.js 1、从卸载程序卸载程序和功…

【性能测试】Jemeter+mysql+CSV+InfluxDB+Granafa数据库性能测试及监控

Jmeter连接Mysql并执行事务 一、下载驱动并加入jmeter 1.mysql驱动下载地址:MySQL :: Download MySQL Connector/J (Archived Versions) 找到对应的驱动下载(版本一定要对应) 2.下载后,解压,找到驱动jar包复制到桌面: 3.把驱动j…

CODOSYS之结构化文本(ST)——中级篇(一)计时器的应用

标准库中常用的计时器有如下四个(部分环境还支持高精度计时器如LTON等等): .RTC .TON .TOF .TP 本文将对将对上述四个计时器进行简单的讲解。 .RTC: RunTime 时钟定时器,返回启动时间,当前时间和日…

别搞了 软件测试真卷不动了...

内卷可以说是 2022年最火的一个词了。2023 年刚开始,在很多网站看到很多 软件测试的 2022 年度总结都是:软件测试 越来越卷了(手动狗头),2022 年是被卷的一年。前有几百万毕业生虎视眈眈,后有在职人员带头“…

L2-042 老板的作息表(极短代码)

题目: 新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了? 本题就请你编写程序,检查任意一张时间表,找出其中…

企业推广常用的网络推广方法有哪些?

网络推广是指通过互联网向目标用户推广产品、服务或品牌的过程,其主要目的是为了扩大业务范围,提高企业知名度,增加销售额。在当今的数字化时代,网络推广已经成为了企业不可或缺的一部分。本文将介绍一些常见的网络推广方法和途径…

Linux安装中文字体

前言 Lunix默认没有中文字库,很容易导致项目开发时出现中文字符乱码的情况。 1 查看linux已安装字体 fc-list如出现-bash: fc-list: command not found 说明Linux中没有安装字体库,需要先安装字体库 2 Linux安装字体 yum -y install fontconfig执行…

不平衡电网电压下虚拟同步发电机VSG控制策略-实现不平衡电压下控制三相电流平衡

资源地址: 不平衡电网电压下虚拟同步发电机VSG控制策略-实现不平衡电压下控制三相电流平衡-电子商务文档类资源-CSDN文库 主体模型: VSG控制;正负序分离;正负序控制;电压电流双环控制!!&…

[LCA]最近公共祖先(倍增)

概念引入 祖先 祖先其实很好理解,一个节点的 **父节点 以及 父节点的父节点 以及 父节点的父节点的父……**都是这个节点的祖先 比如说上面的 ddd 节点, bbb 节点和 aaa 节点都是它的祖先 kkk 级祖先 称节点 𝑥 的父节点为 𝑥 …

带你走进Flutter 3.7

期待已久的新教程上线啦!解锁Flutter开发新姿势,一网打尽Flutter最新与最热技术,点我Get!!! 新年伊始,由 Flutter 3.7 正式版来「打头阵」!我们与整个 Flutter 社区们继续在 Flutter 3.7 中优化了框架,包括…

(一)Linux:自由、开放、灵活的操作系统内核

目录 一、Linux的发展史 二、linux的开源 三、目前的现状 四、企业应用现状 五、发行的版本 六、安装与使用 七、利用云服务器配置Linux环境 一、Linux的发展史 Linux是一款由林纳斯托瓦兹(Linus Torvalds)开发的操作系统内核,它的发布…

用 logging 模块将信息输出到日志文件

当你要用到一些信息去统计画图, 或者你的输出太长了,出现了那种“折叠”,就是说“内容超过1000行”,结果等下一次进入环境,你只能看到结尾的输出,却看不到开头的输出了, 那么你可以使用 Pytho…

【NLP实战】基于Bert和双向LSTM的情感分类【上篇】

文章目录前言简介数据获取与提取数据清洗读取数据,查看数据清洗训练集观察数据分布去除空数据去除重复数据关于去除停用词关于特殊符号储存清洗后的数据集清洗测试集观察数据分布去除空数据去除重复数据(并储存)清洗验证集观察数据分布去除空行去除重复数据(并储存)…