JVM(2)
JVM类加载
指的是java进程运行时,需要把.class文件从硬盘加载到内存,并进行一系列校验解析的过程.
核心: .class文件=>类对象; 硬盘=>内存.
类加载过程
在整个JVM的执行流程中,和程序员关系最密切的就是类加载的过程了,所以我们来看一下类加载的执行流程.
对于一个类,它的生命周期是这样的:
其中前五步是固定的顺序也是类的加载过程,其中中间的三步我们都属于连接,所以类加载有以下几个步骤:
1.加载
2.连接
a.验证
b.准备
c.解析
3.初始化
下面我们来看每个步骤的具体内容.
加载
定义:把硬盘上的.class文件,找到,打开文件,读取到文件指定内容.
"加载"截断是整个"类加载"的过程中的一个阶段,它和类加载ClassLoading是不同的,一个是加载Loading另一个是类加载ClassLoading,所以不要把两者搞混了.
在加载Loading阶段,Java虚拟机需要完成以下事情:
(1)通过一个类的全限定名来获取此类的二进制字节流.
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.
(3)在内存中生成一个代表这个类的java.lang.class对象,作为方法区这类的各种数据访问入口.
验证
验证是进行连接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合 Java虚拟机 规范的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全.
验证选项:
文件格式验证
字节码验证
符号引用验证
准备
定义:给类对象申请内存空间.里面默认值全0(这个阶段中,类对象静态成员变量也是相当于0了).
比如此时有这么一行代码:
pubilc static int value = 123;
它是初始化value的int值为0,而非123.
解析
定义:针对类中的字符串进行处理,解析阶段是Java虚拟机常量池内的符号替换为直接引用的过程,也就是初始化常量的过程.
例如如下程序:
class Test {
private String s = "hello";
}
.class文件内会包含这个hello.上述代码中,很明确的知道,s变量里相当于保存了"hello",也就是字符串常量的地址.但是在文件中,不存在"地址"这样的概念. 地址是"内存"的地址.咱们是文件,是硬盘.
虽然没有地址,但是可以先存储一个类似于地址"偏移量"这样的概念.
接下来,要把.class文件加载到内存中.就会先把"hello"这个字符串加载到内存中.此时"hello"就有地址了. 接下来,s里面的值就可以替换成当前"hello"真实的地址了.
直接引用=>此处文件中填充给s的"hello"的偏移量就可以认为是"符号引用".
初始化
定义:针对类对象后续的初始化,还要执行代码块的逻辑,还会触发父类加载,初始化静态成员,执行静态代码块.
初始化阶段,Java虚拟机真正开始执行类中编写的Java程序代码,将主导权交给应用程序.初始化阶段就是执行类构造器方法的过程.
双亲委派模型
提到类加载机制,不得不提的概念就是"双亲委派模型".(描述了如何找到.class文件的策略).
站在Java虚拟机角度来看,只存在两种不同的类加载器(进行类加载的专门模块):一种是启动类加载器(BootstrapClassLoader),这个类加载器使用C++语言实现,是虚拟机的一部分;另外一种就是其它所有的类加载器,这些类加载器都由Java实现,独立存在于虚拟机外部,全部继承于抽象类java.lang.ClassLoader. 作用:给一个"全限定类名"(带有包名的类名),给定之后,找到对应的.class文件.
这里面,加载器存在"父子关系"(不是面向对象中的),而是类似于"二叉树",有parent指针指向.

Bootstrap ClassLoader负责查找标准库中的目录.
ExtensionClassLoader负责查找扩展库中的目录.
Application ClassLoader负责查找当前项目的代码目录.

启动类加载器:加载JDK中lib目录中的Java核心类库,即JAVA_HOME/lib目录.扩展类加载器.加载lib/ext目录下的类.
应用程序类加载器:加载我们写的应用程序.
自定义类加载器:根据自己的需求定制类加载器
什么是双亲委派模型
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类的加载器去完成,每一个层次的类都是如此,因此所有的加载请求最终都应该传送到最顶层的启动器的加载器当中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会自己尝试去完成加载.
具体流程:
1.从ApplicationClassLoader作为入口,先开始工作.
2.ApplicationClassLoader不会立即搜索自己负责的目录,要把搜索任务交给它的父亲
3.ExtensionClassLoader也不想立即搜索自己负责的目录,也把搜索目录交给自己的父亲.
4.BootstrapClassLoader也不想立即搜索,把搜索目录交给父亲.
5.BootstrapClassLoader发现自己没有父亲,才会真正搜索负责的目录(标准库目录).通过全限定类名,尝试在标准库目录中找符合要求的.class文件.
(1)如果找到了,接下来就直接进入到打开文件/读文件流程
(2)如果没找到,回到孩子这一辈的加载器中,尝试继续加载.
6.ExtensionClassLoader收到父亲交给他的任务后,自己自行搜索负责的目录.(当前项目目录/第三方目录)
(1)如果找到了,接下来进入后续的流程.
(2)如果没找到,也是回到孩子这一辈类加载器中继续加载.
7.ApplicationClassLoader收到父亲交给它的任务后,自己负责搜索的目录(当前项目目录/第三方目录)
(1)如果找到了,接下来就进入了后续流程
(2)如果未找到,也会回到这一辈的类加载器继续尝试加载.由于默认情况下ApplicationClassLoader没有孩子了,说明类加载的过程失败了,就出现ClassNotFoundException异常.
这样的过程,也与自己工作中问题处理逻辑一样:

当基层员工遇到一个问题时(自己拿不定主意),然后交给中层领导.,中层领导也拿不定,就会交给老板决定.老板如果能解决,就会直接解决,如果觉得没必要,就会交给中层领导,让它们自行解决,中层领导觉得自己能解决就会直接解决如果觉得没必要,就会交给员工解决.
这样的问题汇报是很重要的.
按照上述的顺序,假定在代码中定义了一个java.lang.String这样的类,最终执行结果,自定义的类,不会被jvm加载.
上述的设定,也可以有效避免自己写的类,不小心和标准库中的类名重复,导致标准库的类名失效.
上述一系列过程,也可以通过自己写一个类加载器打破原有过程,不过实现非常麻烦.
双亲委派模型的优点
1.避免重复加载类:比如A类和B类都有一个父类C类,那么A启动时就会将C类加载起来,那么在B类进行加载时就不需要重复加载C类了.
2.安全性:使用双亲委派模型也可以保证了Java核心的API不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个java.lang.Object类的话,那么程序运行的时候,系统就会出现多个不同的Object类,而有些Object类又是用户自己提供的因此安全性就不能得到保证了.
相关文章:
JVM(2)
JVM类加载 指的是java进程运行时,需要把.class文件从硬盘加载到内存,并进行一系列校验解析的过程. 核心: .class文件>类对象; 硬盘>内存. 类加载过程 在整个JVM的执行流程中,和程序员关系最密切的就是类加载的过程了,所以我们来看一下类加载的执行流程. 对于一个类…...
青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全
EasyMD5 题目描述:php没有难题 考点总结:脑洞题目,不如我出(狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候,提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …...
一文认识蓝牙(验证基于Aduino IDE的ESP32)
1、简介 蓝牙技术是一种无线通信的方式,利用特定频率的波段(2.4GHz-2.485GHz左右),进行电磁波传输,总共有83.5MHz的带宽资源。 1.1、背景 蓝牙(Bluetooth)一词取自于十世纪丹麦国王哈拉尔Haral…...
2W字-35页PDF谈谈自己对QT某些知识点的理解
2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近,也在对自己以前做的项目做一个知识点的梳理,发现可能自己以前更多的是用某个控件,以及看官方手册,但是没有更…...
Docker知识点总结
二、Docker基本命令: Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装,安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker: yum install docker -y -y 表示自动确认…...
Redis 消息队列:构建消息代理的 4 个简单步骤
消息代理是一种使系统、应用程序和服务能够通信和交换信息的软件。它在正式消息传递协议之间转换消息,并允许相互依赖的服务直接“对话”,即使是用不同语言编写或在不同平台上实现也是如此。在微服务中使用异步通信时,通常会使用消息代理。 消息代理可确保可靠且稳定的通信,…...
kafka三节点集群平滑升级过程指导
一、前言 Apache Kafka作为常用的开源分布式流媒体平台,可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据,构建对数据流的变化进行实时反应的应用程序,已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…...
Golang 简介与基本语法学习
Go,也被称为 Golang,是一门由 Google 设计的开源编程语言。它旨在提供高效的开发体验,同时具备并发性、内存安全和简洁性。本篇博客将介绍 Golang 的基本语法和一些示例,帮助读者快速入门这门令人着迷的语言。 简介 Go 语言的设…...
深入理解网络通信基本原理和tcp/ip协议
深入理解网络通信基本原理和tcp/ip协议 一、计算机网络体系1,计算机网络体系结构2,网络中数据传输2.1,浏览器中输入一个url的执行流程2.2,数据在网络中是的传输流程 3,三次握手和四次挥手3.1,三次握手3.1.1…...
Jetson系统烧录环境搭建
一 序言 Jetson 系列产品烧录系统的方法一般有两种,一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统(请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》)。另一种即为当前文档所描述的,在安装 Ubun…...
【MySQL】:约束全解析
🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…...
设计一基于Text generation web UI的语言模型部署与远程访问的方案
前言 Text generation web UI可为类ChatGPT的大型语言模型提供能够快速上手的网页界面,不仅可以提高使用效率,还可满足私有化部署,或对模型进行自定义。目前,该Web UI已经支持了许多流行的语言模型,包括LLaMA、llama.…...
大数据概述
学习大数据有什么用? 2010年:大数据技术体系开始在国内火热 2015年:国务院印发《促进大数据发展行动纲要》 2016年:发改委发布关于组织实施促进大数据发展重大工程的通知 2017年:工信部印发大数据产业规划(2016-20…...
Muduo库编译学习(1)
1.muduo库简介 muduo是由Google大佬陈硕开发,是一个基于非阻塞IO和事件驱动的现代C网络库,原生支持one loop per thread这种IO模型,该库只支持Linux系统,网上大佬对其褒贬不一,作为小白用来学习就无可厚非了。 git仓库…...
【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug
文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…...
ZYNQ--MIG核配置
文章目录 MIG核配置界面多通道AXI读写DDR3MIG核配置界面 Clock Period: DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关。本实验选择 1250ps,对应 800M,这是本次实验所采用芯片可选的最大频率。注意这个时钟是 MIG IP 核产生,并输出给…...
MySQL 多表查询 连接查询 内连接
介绍 内连接查询是两张表中交集的部分 连接模式 隐式内连接 SELECT 字段列表 FROM 表1,表2 WHERE 条件显式内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件案例 有两张表一个表为学生表,另一个表为班级表,现在需要查询学生时候在查…...
T - SQL使用事务 及 在Winform使用事务
事务适用场景 1 事务使用在存储过程中,直接在数据库中进行编写 2 事务使用在Winfrom项目中 SQl:使用事务转账操作的实例 一般都会找一个变量记录错误的个数,error记录上一句sql的错误和错误编号 declare errornum int 0 -- 定义…...
string(三)--实现
大家看了这么久的string了,可能对string的简单实现有兴趣,所以我实现了一个string类的常用接口,大家可以自行查看: 我是分多文件写的: string.h: #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <ios…...
textbox跨线程写入
实现实例1 实现效果 跨线程实现 // 委托,用于定义在UI线程上执行的方法签名 //public delegate void SetTextCallback(string text);public void textBoxText(string text){// 检查调用线程是否是创建控件的线程 if (textBox1.InvokeRequired){// 如果不是&#…...
如何快速提升中文文献管理效率:Jasminum插件3大核心功能完整指南
如何快速提升中文文献管理效率:Jasminum插件3大核心功能完整指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在…...
Graphormer分子预测模型5分钟快速部署:零基础搭建药物发现AI工具
Graphormer分子预测模型5分钟快速部署:零基础搭建药物发现AI工具 1. 项目概述 Graphormer是微软研究院开发的基于Transformer架构的分子属性预测模型,专门用于处理分子图结构数据。与传统的图神经网络(GNN)相比,Graphormer通过创新的结构编…...
G-Helper完整指南:解决华硕笔记本性能管理与系统优化的三大痛点
G-Helper完整指南:解决华硕笔记本性能管理与系统优化的三大痛点 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, …...
如何让 Claude Code 彻底变聪明:完整记忆 + 插件体系 + 本地零占用实战教程(2026最新)!!!
从“每次重启就失忆的实习生” → “拥有长期记忆、实时知识、安全检查、结构化工作流的资深架构师”大家好,我最近在用 Claude Code 开发项目时,深深感受到上下文丢失和知识过时的痛苦。经过一番折腾,我把目前社区最强、最实用的插件体系全部…...
.NET源码生成器基于partial范式开发和nuget打包绞
1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时,OpenSpec 会提示你选择使用的 AI 工具(Claude Code、Cursor、Trae、Qoder 等)。 3 O…...
李宏毅老师最新大模型入门教程,带你快速掌握生成式AI核心,轻松进阶前沿水平!
现在国内外关于大模型入门教程做的比较好的并不多,这其实也是一件好事,有难度和有门槛才能避免烂大街,现在大模型入门教程热度最高的包括李宏毅老师、吴恩达老师、Datawhale开源社区等 选择合适的入门学习教程,能少走弯路…...
一文搞懂 Spring Cloud:从入门到实战的微服务全景指南(建议收藏)柑
一、中间件是啥?咱用“餐厅”打个比方 想象一下,你的FastAPI应用是个高级餐厅。 ?? 顾客(客户端请求)来到门口。- 迎宾(CORS中间件):先看你是不是从允许的街区(域名)来…...
HarmonyOS-ArkTS-新手完整复现-含环境配置
HarmonyOS ArkTS 新手完整复现:从环境配置到网络列表 App(超细步骤) 欢迎访问开源鸿蒙 PC 开发者社区(https://harmonypc.csdn.net/)。 摘要 本文面向零基础/初学者,完整讲清: 如何在 Window…...
C/C++核心语法与嵌入式开发实战解析
1. C/C核心语法深度解析与面试高频考点作为从事嵌入式开发十余年的老手,我见过太多候选人在C/C基础问题上折戟沉沙。本文将系统梳理那些面试官最爱问的核心语法点,结合工业级开发经验,带你掌握真正实用的编程精髓。1.1 const关键字的工程级应…...
嘉立创-AD PCB封装导入(含3D封装)
大多数元器件都可以在立创商城找到2D和3D封装,点击立即打开 COPY 2D封装 1.切换到PCB 2.导出PCB文件 3.用AD打开下载的PCB文件,复制时选择中心吸附点 4.在自己的库中添加,并重命名 5.对齐原点粘贴并保存 6.至此2D封装COPY完成 COPY 3D模型 …...

