JVM类加载器面试题及原理
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。
1. 类加载器的种类
- 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库
- 扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类
- 应用类加载器(AppClassLoader):用于加载classPath下的类
- 自定义类加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则。
2. 双亲委派模型
2.1 原理
加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类
- student类在应用类加载器,向上委托,但lib和ext目录都没有student,所以向下由含有student类的子加载器(应用类加载器)加载student类
- string类在应用类加载器,向上委托,lib目录下有,于是加载string类然后返回给应用类加载器让它直接使用
2.2 使用场景
JVM为什么采用双亲委派机制?
- 通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性
- 为了安全,保证类库API不会被修改
ex:
package java.long;
public class String{public static void main (Stringll args) {System.out.println("demo info");}
}
此时执行main函数,会出现异常,在类java.lang.String 中找不到 main 方法
错误:在类 java.Lang.string 中找不到 main 方法,请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展
javafx.application.Application
报错原因:由于是双亲委派的机制,javalang.String的在启动类加载器得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有main方法。这样就能防止恶意篡改核心API库。(所以这就是为什么类名不能是关键字的根本原因)
3. 类装载的执行过程
- 类从加载到虚拟机中开始,直到卸载 止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。
- 其中,验证、准备和解析这三个部分统称为连接(linking)
3.1 加载阶段
查找和导入class文件
- 通过类的全名,获取类的二进制数据流。
- 解析类的二进制数据流为方法区内的数据结构(Java类模型)
- 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口
3.2 连接阶段
3.2.1 验证阶段
保证加载类的准确性
验证类是否符合JVM规范,安全性检查
- 格式检查,如:文件格式是否错误、语法是否错误、字节码是否合规(1)(2)(3)
- 文件格式验证
- 元数据验证
- 字节码验证
- Class文件在其常量池会通过字符串记录自己将要使用的其他类或者方法,检查它们是否存在(4)
4. 符号引用验证
3.2.2 准备阶段
内类变量分配内存并设置类变量初始值
- static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
- static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成
- static变量是final的引用类型,那么赋值也会在初始化阶段完成
public class Application {static int b = 10; //(1)static final int c = 20; //(2)static final String d = "hello"; //(2)static final Object obj = new Object; //(3)
}
3.2.3 解析阶段
把类中的符号引用转换为直接引用
比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法
- 符号引用:代#的是符号引用,符号引用可能也引用其他符号引用或直接引用类
- 直接引用:找到符号指的类与方法去执行
3.3 初始化阶段
对类的静态变量,静态代码块执行初始化操作
- 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
- 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
//Animal是Cat父类
//子类初始化,如果父类还没初始化,会引发父类先初始化
System.out.println(Cat.sex);
//子类访问父类静态变量,只触发父类初始化
System.out.println(Cat.num);
3.4 使用阶段
JVM 开始从入口方法开始执行用户的程序代码
- 调用静态类成员信息(比如:静态字段、静态方法)
- 使用new关键字为其创建对象实例
3.5 卸载阶段
当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象。
相关文章:
JVM类加载器面试题及原理
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库扩展类加载器ÿ…...
《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》
”你没想过也许是这个镇子对你来说太小了吗? 对我而言,这个小镇容不下我的雄心壮志。 “ 什么是 Node.js? Node.js是一个跨平台JS运行环境,使开发者可以搭建服务器端的JS应用程序 作用:使用 Node.js 编写服务器端程序…...
关于Springboot 应配置外移和Maven个性化打包一些做法
期望达到的效果是每次更新服务器端应用只需要更新主程序jar 依赖jar单独分离。配置文件独立存放于文件夹内,更新程序并不会覆盖已有的配置信息。 一、配置外移 1、开发环境外移 做法:在项目同级或者上级创建config文件夹放置配置文件,具体m…...
Lab18_ SQL injection with filter bypass via XML encoding
文章目录 前言:进入实验室构造 payload 前言: 实验室标题为: 通关 XML 编码绕过过滤器的 SQL 注入 简介: 此实验室的库存检查功能中存在 SQL 注入漏洞。查询结果在应用程序的响应中返回,因此您可以使用 UNION 攻击…...
网络空间安全(21)验证码安全
一、基本概念 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。它通过…...
DMA在STM32中的应用
在STM32微控制器中,DMA(直接内存访问)是实现高效数据搬运的核心技术,能够显著减轻CPU负担并提升系统性能。以下是STM32中DMA的典型应用及配置方法: 1. STM32的DMA控制器架构 DMA控制器数量:不同系列配置不同,如STM32F1系列有1个DMA控制器(DMA1,7通道),F4系列有2个(…...
V8引擎中的垃圾回收机制如何工作?
V8引擎中的垃圾回收机制主要通过分代回收和增量标记清除算法来管理内存。以下是其工作原理的详细说明: V8 的垃圾回收机制基于以下核心设计原则: 1. 分代假设:大多数对象的生命周期很短,只有少数对象会存活较长时间;…...
汇编的伪指令
一、介绍 伪指令是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有对应机器码,只用于汇编过程中为汇编程序提供汇编信息,帮助编译器编译。当汇编结束时,伪指令的使命也就结束了。伪操作可以实现如下功能…...
【TI】如何更改 CCS20.1.0 的 WORKSPACE 默认路径
参考链接: 如何更改 CCS Theia 中工作区的默认位置?- Code Composer Studio 论坛 - Code Composer Studio™︎ - TI E2E 支持论坛 --- How to change the default location for the workspace in CCS Theia? - Code Composer Studio forum - Code Comp…...
GStreamer —— 2.13、Windows下Qt加载GStreamer库后运行 - “教程13:播放控制“(附:完整源码)
运行效果(音频) 简介 上一个教程演示了GStreamer工具。本教程介绍视频播放控制。快进、反向播放和慢动作都是技术 统称为 Trick Modes,它们都有一个共同点 修改 Normal playback rate。本教程介绍如何实现 这些效果并在交易中添加了帧步进。特别是,它 显…...
推荐一款好用在线免费软件工具箱-传道软件箱
推荐一款好用在线免费软件工具箱-传道软件箱 传道软件箱 传道软件箱是一款在线免费软件工具箱,无需登录,无需费用,用完就走的软件工具,包有BMI计算、倒计时、单位转换、密码生成器、摩斯电码、代码编辑器、计算器、快递查询、二维…...
机器学习数学基础:40.结构方程模型(SEM)中卡方值与卡方自由度比
结构方程模型(SEM)中卡方值与卡方自由度比教程 在结构方程模型分析里,卡方值和卡方自由度比是评估模型拟合程度的重要指标,下面为大家详细介绍。 一、卡方值(CMIN) (一)基本概念与…...
【JavaEE进阶】Spring AOP详解
目录 🍃什么是AOP 🌳什么是Spring AOP 🌴上手Spring AOP 🚩引入依赖 🚩编写AOP程序 🎍Spring AOP核心概念 🚩切点(Pointcut) 🚩连接点(Join Point) 🚩通知(Advi…...
Docker 的基本概念和优势,以及在应用程序开发中的实际应用
Docker 是一种开源的容器化平台,让开发人员能够打包、发布和运行应用程序在轻量级、可移植的容器中。Docker 容器包含应用程序的代码、运行时环境、系统工具、系统库等,使得应用程序能在任何环境中快速部署和运行。 Docker 的基本概念包括以下几点&…...
python flask
安装 pip install flask 查看版本 pip show flask 启动服务器 设置环境变量,在控制台执行命令,app.py是创建的文件名 windows set FLASK_APPapp.py mac/linux export FLASK_APPapp.py 启动内置web服务器,注意要进入到app.py所在的文…...
关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题
如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入: <meta charset"UTF-8"> 以jsp为例子,我们…...
双向选择排序算法
一 概述 双向选择排序(又称鸡尾酒选择排序)是选择排序的优化版本,核心改进在于每轮遍历同时确定未排序部分的最小值和最大值,分别交换到序列两端,从而减少遍历轮数。 二 时间复杂度 时间复杂度为(O(n^2)),但实际比较次数约为标准选择排序的 (1/2)。 三 C++实现代…...
P8662 [蓝桥杯 2018 省 AB] 全球变暖--DFS
P8662 [蓝桥杯 2018 省 AB] 全球变暖--dfs 题目 解析讲下DFS代码 题目 解析 这道题的思路就是遍历所有岛屿,判断每一块陆地是否会沉没。对于这种图的遍历,我们首先应该想到DFS。 代码的注意思想就是,在主函数中遍历找出所有岛屿,…...
2-kafka集群环境搭建
本文介绍kafka集群环境的搭建,我利用三个虚拟机搭建。文中我一步步演示了过程中可能会碰到的问题,在文章的最后,利用jmx,能看到详细的各个kafka broker的运行情况。 -1、环境 ubuntu :22.04-ltskafka: 2.8java: 17 …...
ROS2与Navigation2入门教程:构建与安装Nav2
Navigation2(Nav2)是ROS2中用于机器人导航的核心框架,支持路径规划、避障、SLAM等功能。本教程将详细介绍Nav2的安装与构建方法,涵盖二进制安装、源码编译及Docker部署等多种方式,适用于不同开发需求。 一、通过APT安…...
MySQL入门手册
MySQL入门手册:从零开始掌握数据库管理 📖 一、MySQL是什么? MySQL 是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现隶属于Oracle旗下。它使用**结构化查询语言ÿ…...
深度学习算法实战——风格迁移(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍 风格迁移(Style Transfer)是深度学习中的一个热门应用,旨在将一幅图像的风格迁移到…...
基于SpringBoot的智能问诊系统设计与隐私保护策略
通过SpringBoot框架,我们可以快速搭建一个智能问诊系统,为用户提供便捷的线上医疗服务。然而,在系统设计和实现过程中,如何保障用户的隐私和数据安全,始终是一个亟需关注的问题。本文将探讨基于SpringBoot的智能问诊系…...
开发ai模型最佳的系统是Ubuntu还是linux?
在 AI/ML 开发中,Ubuntu 是更优选的 Linux 发行版,原因如下: 1. 开箱即用的 AI 工具链支持 Ubuntu 预装了主流的 AI 框架(如 TensorFlow、PyTorch)和依赖库,且通过 apt 包管理器可快速部署开发环境。 提…...
Vue 3 ref(new Map()) 无法触发watch
现象 const map ref(new Map()); 通过 map.value.set(k, v); 不能触发watch 下面验证,map.value.set 并不能触发watch 的监听 代码 <script setup lang"ts"> import { ref, triggerRef, watch } from vue;const map ref(new Map<string, R…...
NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发
一、软件介绍 文末提供程序和源码下载 NoteGen 是一款专注于记录和写作的跨平台 AI 笔记应用,基于 Tauri 开发。NoteGen 的核心理念是将记录、写作和 AI 结合使用,三者相辅相成。记录功能可以帮助用户快速捕捉和整理碎片化知识。整理功能是连接记录和写…...
repo访问gerrit.googlesource失败
编译openharmony的时候,repo阶段碰到一个问题,建议不要通过 apt install安装,里面的源来自google curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/repo chmod 755 ~/repo 执行类似这样的操作 repo init -u gitgitee.com:…...
IDEA中Git版本回退终极指南:Reset与Revert双方案详解
目录 前言一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提交历史1.2、选择目标版本1.3、选择回退模式1.3.1、Soft(推荐)1.3.2、Mixed1.3.3、Hard(慎用)1.3.…...
【系统架构设计师】体系结构复审
目录 1. 说明2. 例题2.1 例题1 1. 说明 1.体系结构设计、文档化和复审是一个迭代过程。2.从这个方面来说,在一个主版本的软件体系结构分析之后,要安排一次由外部人员(用户代表和领域专家)参加的复审。3.鉴于体系结构文档标准化以…...
Unity之如何实现哔哩哔哩直播弹幕游戏
前言 什么是直播间互动? 当我们使用哔哩哔哩进行直播或者观看视频时,我们可以通过接入哔哩哔哩提供的 直播&互动玩法SDK,让直播和视频可以与Unity3D游戏客户端或者游戏服务器进行互动。 环境要求 Unity 2020.x或更高版本 依赖库:Newtonsoft Json Unity Package 在P…...
视觉图像处理
在MATLAB中进行视觉图像处理仿真通常涉及图像增强、滤波、分割、特征提取等操作。以下是一个分步指南和示例代码,帮助您快速入门: 1. MATLAB图像处理基础步骤 1.1 读取和显示图像 % 读取图像(替换为实际文件路径) img = imread(lena.jpg); % 显示原图 figure; subplot(2…...
学习LED驱动知识(二)
ppt来自B站周老师 使用普通元器件或者电源芯片构建电路驱动LED 1.电阻降压限流设计 案例一: USB供电电压为5V,因为LED的Vf为3v,所以电路只能6个LED并联,直接跟电源并联电流太大,LED会过流导致断路。所以要先串联一个…...
011---UART协议的基本知识(一)
1. 摘要 文章为学习记录。主要介绍 UART 协议的概述、物理层、协议层、关键参数。 2. UART概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART(串口),是一种异步****串…...
如何选择开源向量数据库
文章目录 评估维度查询性能索引与存储扩展性数据管理能力生态支持 常见向量数据库对比 评估维度 选择开源向量数据库时,需要综合考虑查询性能、数据规模、索引构建速度、生态支持等多个因素,以下是关键的评估维度:选择开源向量数据库时&…...
SpringBoot项目配置文件
SpringBoot项目提供了多种属性配置方式(properties、yaml、yml) yml配置文件 使用Apifox可以方便开发接口、前端测试等 工程搭建: 1.创建SpringBoot工程,并引入web开发起步依赖、mybatis、mysql驱动、lombok 2.创建数据库表&am…...
L33.【LeetCode笔记】循环队列(数组解法)
目录 1.题目 2.分析 方法1:链表 尝试使用单向循环链表模拟 插入节点 解决方法1:开辟(k1)个节点 解决方法2:使用变量size记录队列元素个数 获取队尾元素 其他函数的实现说明 方法2:数组 重要点:指针越界的解决方法 方法1:单独判断 方法2:取模 3.数组代码的逐步实现…...
前端知识点---库和包的概念
1. 什么是库(Library)? 库(Library) 是一组可复用的代码集合,提供特定功能(如网络请求、UI 组件、数据处理等)。 特点: 只是代码的集合,没有完整的应用结构…...
【CSS3】筑基篇
目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…...
CentOS7 安装docker并配置镜像加速
一、Yum 安装docker【不推荐】 /var/lib/docker 路径主要用于存储容器数据,在使用和操作过程中数据量会逐渐增加。因此,在生产环境中,建议为 /var/lib/docker 单独挂载一个硬盘。也可以使用软连接的方式 1.1 安装必要的一些系统工具 yum i…...
【Go每日一练】统计字符出现的次数
👻创作者:丶重明 👻创作时间:2025年3月9日 👻擅长领域:运维 目录 1.😶🌫️题目:2.😶🌫️资源:3.😶🌫️代…...
正向代理与反向代理
代理: 通常称为代理、代理服务器或 Web 代理,代理一般是指正向代理,是位于一组客户端计算机之前的服务器。当这些计算机向 Internet 上的站点和服务发出请求时,代理服务器将拦截这些请求,然后代表客户端与 Web服务器进行通信&…...
报表DSL优化,享元模式优化过程,优化效果怎么样?
报表DSL优化与享元模式应用详解 一、报表DSL优化 1. 问题背景 报表系统通常使用领域特定语言(DSL)定义模板结构、数据绑定规则及样式配置。随着复杂度提升,DSL可能面临以下问题: 冗余配置:重复定义样式、布局或数据源…...
双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开
双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开 1. 软件环境⚙️2. 问题描述🔍3. 解决方法🐡解决步骤 4. 结果预览🤔 1. 软件环境⚙️ Windows10 或 Windows11 专业版64位,安装MotionGo软件(…...
学习前置知识第18和19天
今天要做什么? 1:显示数字要求格式 2:无符号除法指令:div 3:前面用vhd和img等格式进行系统界面启动,详细了解多种镜像格式文件的区别 一:显示数字要求格式 屏幕上显示的数字格式,三个颜色编码和数字属性 1&…...
C#运算符详解
一、运算符分类与功能 1.算术运算符 基本运算:(加)、-(减)、*(乘)、/(除)、%(取模) int a 10 / 3; // 结果为3(整数除…...
生成任务,大模型
一个生成项目 输入:文字描述(但是给的数据集是一串数字,id,ct描述,医生描述) 输出:诊断报告 一、数据处理 import pandas as pd #处理表格数据pre_train_file "data/train.csv"tr…...
下载Hugging Face模型的几种方式
1.网页下载 直接访问Hugging Face模型页面,点击“File and versions”选项卡,选择所需的文件进行下载。 2.使用huggingface-cli 首先,安装huggingface_hub: pip install huggingface_hub 然后,使用以下命令下载模型࿱…...
【Elasticsearch入门到落地】9、hotel数据结构分析
接上篇《8、RestClient操作索引库-基础介绍及导入demo》 上一篇我们介绍了RestClient的基础,并导入了使用Java语言编写的RestClient程序Demo以及将要分析的数据库。本篇我们就要分析导入的宾馆数据库tb_hotel表结构的具体含义,并分析如何建立其索引库。 …...
【由技及道】量子构建交响曲:Jenkinsfile流水线的十一维编程艺术【人工智障AI2077的开发日志008】
摘要:当代码提交触发时空涟漪,当构建流水线穿越量子维度——欢迎来到自动化构建的终极形态。本文将揭示如何用Jenkinsfile编写量子构建乐章,让每次代码提交都成为跨维度交响乐的音符。 动机:构建系统的量子哲学 “主人啊ÿ…...
Unity开发——CanvasGroup组件介绍和应用
CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染顺序的组件。 一、常用属性的解释 1、alpha:控制UI的透明度 类型:float,0.0 ~1.0, 其中 0.0 完全透明,1.0 完全不透明。 通过调整alpha值可以实现UI的淡入淡…...