【面试】一文读懂Java类加载全过程

news2025/1/8 22:40:58

文章目录

  • 一、概述
    • 1. 类加载器
    • 2. 加载阶段
    • 3. 验证阶段
    • 4. 准备阶段
    • 5. 解析阶段
    • 6. 初始化阶段
    • 类加载过程总结
  • 二、相关问题
    • Q: 什么是类加载?
    • Q: Java中有哪些类加载器?
    • Q: 类加载的过程包括哪些步骤?
    • Q: 类加载器的双亲委派模型是什么?
    • Q: 什么是类加载器的命名空间?
    • Q: 如何打破类加载器的双亲委派模型?
    • Q: 类加载器的缓存机制是什么?
    • Q: 如何自定义类加载器?
    • Q: 什么是热部署(HotSwap)?怎样实现Java代码的热部署?

一、概述

在这里插入图片描述

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代码。

二、相关问题

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中。

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

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

相关文章

告别StringUtil:使用Java的全新String API优化你的代码

前言 Java编程语言每一次主要更新,都引入了许多新功能和改进。 并且在String 类中引入了一些新的方法,能够更好地满足开发的需求,提高编程效率。 repeat(int count):返回一个新的字符串,该字符串是由原字符串重复指定…

Jetson TX1 /TX2 对比介绍

大家好,我是虎哥,经过一段时间的整理,针对TX1/TX2这些看起来已经落伍的产品,如何找到合适的应用场景,我也整体上做了一些了解好调研。现在由于资料很多都比较老了,有些表述也有些前后表述不一,所…

ClickHouse环境搭建

目录 1 ClickHouse 的安装1.1 准备工作1.1.1 确定防火墙处于关闭状态1.1.2 CentOS 取消打开文件数限制1.1.3 安装依赖1.1.4 CentOS 取消 SELINUX 1.2 单机安装1.2.1 在 hadoop102 的/opt/software 下创建 clickhouse 目录1.2.2 将安装文件上传到 hadoop102 的software/clickhou…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的伽马变换校正算法增强(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的伽马变换校正算法增强(C) Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调…

第三章 作业(7BF)【计算机系统结构】

第三章 作业(7BF)【计算机系统结构】 前言推荐第三章 作业(7BF)71115鲲鹏流水线调研华为鲲鹏处理器ARM体系的总体思想ARM的流水线结构 最后 前言 2023-4-10 18:49:41 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐…

上一次c语言多文件处理代码的改进和总结

先看看上一次的文件: (3条消息) 认真复习c语言1_穿花云烛展的博客-CSDN博客 对于有重复结构体定义但是并不会报错,只是难以修改而已:为了解决这个一改就要改两次的情况,这里有一个解决方案: 上面的代码是可以运行的&…

常见的Web攻击技术

文章目录 前言HTTP 不具备必要的安全功能在客户端即可篡改请求针对 Web 应用的攻击模式 因输出值转义不完全引发的安全漏洞跨站脚本攻击XSSXSS实例 SQL 注入攻击实例 HTTP 首部注入攻击HTTP 首部注入攻击案例HTTP 响应截断攻击 因会话管理疏忽引发的安全漏洞会话劫持会话固定攻…

Java企业级开发学习笔记(2.2)利用MyBatis实现CRUD操作

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/ajSEO】 文章目录 一、准备工作二、查询表记录2.1 在映射器配置文件里引入结果映射元素2.2 添加按姓名查询用户记录功能2.2.1 添加按姓名查询的映射语句2.2.2 添加按姓名查询用户记录的测试方法2.…

17、嵌入式Servlet容器

文章目录 1、切换嵌入式Servlet容器2、定制Servlet容器 【尚硅谷】SpringBoot2零基础入门教程-讲师:雷丰阳 笔记 路还在继续,梦还在期许 1、切换嵌入式Servlet容器 ● 默认支持的webServer ○ Tomcat, Jetty, or Undertow ○ ServletWebServerApplicati…

C++linux高并发服务器项目实践 day7

Clinux高并发服务器项目实践 day7 进程间通信匿名管道管道的特点匿名管道的使用创建匿名管道查看管道缓冲大小命令查看管道缓冲大小函数匿名管道通信案例 管道的读写特点 有名管道有名管道的使用写FIFO管道读FIFO管道总结有名管道实现简单版聊天功能 进程间通信 进程是一个独立…

SRv6实践项目(五):ONOS控制平面实现控制

在先前的几个小结中,一共了解了: p4的编译过程p4runtime的实现原理NDP协议的简单工作流程YANG模型的定义以及用处基于YANG的配置和状态的读写 一共实现了: Mininet拓扑创建p4的基本框架编写对数据平面进行订阅以实现状态读取对数据平面进行…

OJ系统刷题 第十一篇(重点题)

13463 - 折点计数(难题!重点题!) 时间限制 : 1 秒 内存限制 : 128 MB 给定 n 个整数表示一个商店连续 n 天的销售量。 如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来…

玩转车载影像传输技术 ,学习Opengl与Surface渲染提升车载影像传输效果

近年来,随着智能化汽车的快速发展,车载倒车影像逐渐成为了汽车安全辅助系统的标配,而高清传输的倒车影像则成为了目前主流的倒车影像传输方式。在这一过程中,Opengl与Surface渲染技术的应用也是不可或缺的一环。 一、高清传输倒车…

E. Archaeology(纯思维)

Problem - E - Codeforces 爱丽丝买了一个刚果总理视频的订阅,正在看一部关于苏格兰卡特林湖的因子岛的考古发现的纪录片。考古学家发现了一本书,其年代和来源都不明。也许爱丽丝可以对它进行一些解释? 这本书包含一串字符 "a"、&…

【AI绘画】Stable Diffusion的介绍及程序示例

Stable Diffusion 1.背景2.StableD 的原理3.StableD 的应用3.1.如何使用 StableD 进行图像生成3.2 图像生成与编辑3.2.1 生成新图像3.2.2 图像编辑 1.背景 近年来,随着人工智能技术的发展,图像生成和合成技术得到了很大的发展。Stable Diffusion (Stable…

MyBatis的关联映射和缓存机制

学习目标: 了解数据表之间的三种关联关系了解对象之间的三种关系熟悉关联关系中的嵌套查询和嵌套结果掌握一对一关联映射掌握—对多关联映射掌握多对多关联映射熟悉Mybatis的缓存机制 文章概述: 前面几章介绍了MyBatis的基本用法、关联映射和动态SQL等…

CompletableFuture异步编排

CompletableFuture异步编排 1、CompletableFuture异步编排1.1 为什么需要异步编排1.2 CompletableFuture介绍1.3 创建异步对象1.4 线程串行化与并行化方法1.5 多任务组合1.6 优化商品详情页(业务代码)1.6.1 未优化之前的代码1.6.2 使用CompletableFuture异步编排1.6.3 测试功能…

Linux 下 REST 客户端的新选择:Insomnia 3.0

正在为 Linux 桌面端找一个免费的 REST 客户端? 别睡不着觉了!试试 Insomnia。 这个应用是跨平台的,可以工作在 Linux、macOS、Windows。开发者 Gregory Schier 告诉我们他创造这个应用是为了“帮助开发者处理和 REST API 的通信”。他还说&a…

如何在Java中创建临时文件?

在Java程序中,有时需要创建临时文件来暂存数据或者执行某些操作。Java提供了许多方式来创建临时文件。在本教程中,我们将介绍如何使用Java标准库来创建临时文件。 一、使用File.createTempFile()方法 Java标准库中的File类提供了createTempFile()方法来…

设计模式--单例模式

介绍 所谓类的单例模式 就是采取一定的方法保证在整个软件系统中对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法) 比如 Hibemate的SessionFactory 它充当数据存储源的代理 并负责创建Session对象 SessionFactory并不是轻量级的 一般情况下 一个…