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){// 如果不是&#…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...

