深入理解JVM 类加载机制
深入理解JVM 类加载机制
虚拟机如何加载Class文件?
Class文件中的信息进入到虚拟机后会发生什么变化?
类加载机制就是Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机之间实使用Java类型的过程。
Java语言中,类型的加载、连接和初始化都是在程序运行期间完成的。
Java运行期间动态加载和动态连接 --> Java具有可以动态扩展的语言特性
约定
- 类型[可能是接口也可能是类]
- Class文件[指一串二进制字节流,不一定存于具体的磁盘文件]
类型的生命周期

类型加载: 加载、验证、准备、解析、初始化
加载阶段
JVM任务
- 通过一个类的全限定名来获取定义此类的二进制字节流
- 将字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口 [类型数据妥善安置在方法区之后,会在Java堆内存中实例化一个java.lang.Class类的对象,
这个对象将作为程序访问方法区中的类型数据的外部接口。]
类加载阶段可以分为 : 非数组类型的加载阶段和数组类型的加载阶段
- 非数组类型的加载阶段,开发人员可以使用java虚拟机内部的类加载器完成,也可以自定义类加载器完成。
- 数组类不通过类加载器创建。由虚拟机直接在内存中动态构造出来,数组类的元素类型最终靠类加载器完成加载。
验证阶段
确保Class文件的字节流在包含的信息符合《Java虚拟机规范》的全部约束要求
验证阶段任务
- 文件格式验证
- 元数据验证 语义分析
- 字节码验证
- 符号引用验证 发生在虚拟机将符号引用转化为直接引用时
确保解析行为能够正常执行
准备阶段
为类变量分配内存并设置初始值【一般设置为数据类型的零值】
特殊情况
//准备阶段设为 0
public static int value = 123;
// Constant Value 属性, 准备阶段变量值就会被初始化为ConstantValue属性所指定的初始值
//准备阶段设为 123
public static final int value = 123;
解析阶段
符号引用替换为直接引用
类或接口的解析
字段解析
方法解析
接口方法解析
待补充:
方法类型解析
方法句柄解析
CONSTANT_Dyna-mic_info和
CONSTANT_InvokeDynamic_info
初始化阶段
直到初始化阶段,Java虚拟机才正真开始执行类中编写的Java代码,将主导权移交给应用程序。
根据程序员通过程序编码制定的主观计划去初始化类变量和其他资源。
- 初始化阶段就是执行类构造器()方法的过程。
- ()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的
语句合并产生的. - 编译器按照语句在源文件中出现的顺序收集,所以
静态语句块中只能访问到定义在静态语句块之前的变量 - Java虚拟机会保证在子类的()方法执行前,父类的()方法已经执行完毕。
- 如果一个类中没有静态语句块,也没有对变量的赋值操作,那么编译器可以不为这个类生成()方法。
- 接口中不能使用静态语句块,但仍然有变量初始化的赋值操作,因此接口与类一样都会生成()方法。
- **只有当父接口中定义的变量被使用时,父接口才会被初始化。**所以,执行接口的()方法不需要先执行父接口的()方法。
- 接口的实现类在初始化时也不会执行接口的()方法。
有类继承情况的代码执行顺序
类加载器 – 实现通过一个类的全限定名来获取描述该类的二进制字节流的动作
类与类加载器
每个类加载器都有一个独立的类名称空间。
对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性
类加载器分类
- 启动类加载器 BootstrapClassLoader和起来。[JVM角度]
- 开发人员角度
启动类加载器
- 负责 <JAVA_HOME>\lib 或 -Xbootclasspath参数指定路径
- 编写自定义类加载器时,需要把加载请求委派给引导类加载器去处理,那直接使用null代替
扩展类加载器(Extension Class Loader)
应用程序类加载器(Application Class Loader)
双亲委派模型
- 一个类加载器收到了类加载的请求
- 把这个请求委派给父类加载器去完成
- 所有的加载请求最终都应该传送到最顶层的启动类加载器
- 父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
相关文章:
深入理解JVM 类加载机制
深入理解JVM 类加载机制 虚拟机如何加载Class文件? Class文件中的信息进入到虚拟机后会发生什么变化? 类加载机制就是Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机…...
SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡
目录 一:Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现 二:Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗…...
SpringSecurity+JWT权限认证
SpringSecurity默认的是采用Session来判断请求的用户是否登录的,但是不方便分布式的扩展 虽然SpringSecurity也支持采用SpringSession来管理分布式下的用户状态,不过现在分布式的还是无状态的Jwt比较主流 一、创建SpringBoot的项目 spring-boot-starte…...
Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式
HTTP协议是“请求-响应”模式,浏览器必须先发请求给服务器,服务器才会响应该请求。即服务器不会主动发送数据给浏览器。 实时性要求高的应用,如在线游戏、股票实时报价和在线协同编辑等,浏览器需实时显示服务器的最新数据&#x…...
安全框架springSecurity+Jwt+Vue-2(后端开发)
一、创建项目及配置 ①:创建新的项目及常用包 ②:引入依赖和配置 devtools:项目的热加载重启插件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&…...
6.1.webrc媒体协商
那今天呢?我们来看一下y8 rtc的媒体协商,那实际上在我们之前的课程中呢?我已经向你介绍过y8 rtc的媒体协商了。只不过呢,角度是不一样的,在之前介绍外边tc媒体协商的时候呢,我们是从应用的角度来看。那web …...
Android WebView中打开外部超链接无反应
什么是外部超链接? 相当于是跳转到一个新的网址页面 解决方案选择: 1.在WebView内部中打开外部超链接 设置setSupportMultipleWindows为false即可 webView.settings.setSupportMultipleWindows(false)2.打开系统浏览器打开新页面 设置setSupportMul…...
JMeter集结点的使用场景以及如何使用?
JMeter是一个开源的负载测试工具,它被广泛用于测试应用程序、Web服务和网络协议等的性能。在JMeter中,集结点(JMeter Cluster)是一种分布式测试环境,它允许多个JMeter实例同时工作来模拟高并发负载。 使用集结点的场景…...
2023最新面试题
第一家 自我介绍介绍一下最近一个(最熟悉的一个)项目 项目几个人在负责 项目实际在用了吗,哪个平台在用啊(在哪里上线) 你认为你自己做的项目里面哪个比较难做呢,项目里面有什么难点?常用的是V…...
shell 脚本的函数和数组
函数 —— 封装的一个公式:sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块,在函数中写执行的命令即可;使用函数可以避免代码重复,增加可读性,简化脚本,使用函数可以将大的工程分割为若…...
【RocketMq系列-02】RocketMq的架构解析和高性能设计
RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709【二】RocketMq的架构解析和高性能设计/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514 RocketMq的架构解析和高性能设…...
【数据结构/C++】线性表_单链表的基本操作
#include <iostream> using namespace std; // 2. 单链表 // ElemType 的定义 typedef int ElemType; typedef struct LNode {ElemType data;struct LNode *next; } LNode, *LinkList; // 初始化单链表 bool InitList(LinkList &L) {L (LNode *)malloc(sizeof(LNode…...
flink1.13.6版本的应用程序(maven版)
问题 想要一个指定flink版本的java计算任务hello world最简工程。 解决 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6这里直接使用官方mave模版工程,指…...
深度学习之四(循环神经网络Recurrent Neural Networks,RNNs)
概念 循环神经网络(Recurrent Neural Networks,RNNs)是一类专门用于处理序列数据的神经网络,它在处理时考虑了序列数据的顺序和上下文信息。RNNs 在自然语言处理、时间序列分析、语音识别等领域得到广泛应用。 1. 基本结构: RNN 的基本结构包含一个或多个循环单元,每个…...
【论文精读】HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face
HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face 前言Abstract1 Introduction2 Related Works3 HuggingGPT3.1 Task PlanningSpecification-based InstructionDemonstration-based Parsing 3.2 Model SelectionIn-context Task-model Assignment 3…...
安装gitlab
安装gitlab 环境 关闭防火墙以及selinux,起码4核8G 内存至少 3G 不然启动不了 下载环境 gitlab官网:GitLab下载安装_GitLab最新中文基础版下载安装-极狐GitLab rpm包下载地址: [Yum - Nexus Repository Manager (gitlab.cn)](https://pack…...
Nginx模块开发之http handler实现流量统计(1)
文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…...
JSP编写自己的第一个WebServlet实现客户端与服务端交互
我们在项目中找到java目录 下面有一个包路径 然后 我们在下面创建一个类 我这里叫 TransmissionTest 当然 名字是顺便取的 参考代码如下 package com.example.dom;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet…...
三、Keil安装芯片包、下载固件库、建立STM32工程模板
目录 一、首先在Keil软件上安装好芯片包 二、下载官方固件库 三、建立基于固件库的Keil5工程模板 一、首先在Keil软件上安装好芯片包 STM32有很多系列的芯片,我们平常用的最多的是STM32F1系列的,因此安装F1系列的芯片包在我们初学时,只按照…...
微信相框M1-03花屏抢救照片数据
故障现象 相册屏幕花屏,无法显示,拔掉电源黑屏(内部自带锂电池的) 问题排查 开始怀疑屏幕故障,拆开看到内部,发现是锂电池时间长鼓包后,顶到PCB,PCB板已经翘曲了,导致花…...
DLSS Swapper完整指南:免费一键提升游戏画质与性能的终极解决方案
DLSS Swapper完整指南:免费一键提升游戏画质与性能的终极解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的免费工具,它让你能够轻松管理、下载和替…...
DevEco Studio:多端设备预览
在工程目录中,打开任意一个ets文件:点击右侧的Previewer按钮:打开了预览窗口:点击右上角的Enable Profile Manager:打开Multi-profile preview:就可以同时在多种设备上预览了:...
Apache Log4j jar包下载地址
下载地址 版本号版本时间下载地址 1.2.x 1.2.17May, 2012log4j-1.2.17.jar 阿里云盘下载 | 百度网盘下载 | 夸克网盘下载1.2.16Mar, 2010log4j-1.2.16.jar 阿里云盘下载 | 百度网盘下载 | 夸克网盘下载1.2.15Aug, 2007log4j-1.2.15.jar 阿里云盘下载 | 百度网盘下载 | 夸克网盘…...
Boris开发者指南:如何贡献代码和参与社区建设
Boris开发者指南:如何贡献代码和参与社区建设 【免费下载链接】boris A tiny REPL for PHP 项目地址: https://gitcode.com/gh_mirrors/bo/boris Boris作为一款轻量级但功能强大的PHP REPL(Read-Evaluate-Print-Loop)工具,…...
Deep-Live-Cam部署教程:搭建实时换脸系统
在运行实时视频处理或 AI 图像推理项目时,运行环境的稳定性通常会直接影响处理效果。尤其是在需要长时间推理、处理高清视频流或多人访问的场景中,一些具备稳定资源与网络支持的环境(如莱卡云服务器这类部署方式)通常更适合持续运…...
JTS TestBuilder GUI 使用教程:可视化几何操作的简单方法
JTS TestBuilder GUI 使用教程:可视化几何操作的简单方法 【免费下载链接】jts The JTS Topology Suite is a Java library for creating and manipulating vector geometry. 项目地址: https://gitcode.com/gh_mirrors/jt/jts JTS Topology Suite࿰…...
人生希望的具象化的庖丁解牛
它的本质是:希望并非一种模糊的、被动等待的“情绪”或“运气”,而是一种基于 因果律 (Causality) 和 能动性 (Agency) 的可执行算法 (Executable Algorithm)。它是将抽象的“愿景 (Vision)”拆解为微观的、可触达的、正向反馈的“动作序列 (Action Sequ…...
企业级MCP插件交付倒计时:仅剩47天!微软官方MCP GA前必须完成的6项合规性验证清单
更多请点击: https://intelliparadigm.com 第一章:企业级MCP插件交付倒计时:战略意义与合规紧迫性 企业级MCP(Model Control Protocol)插件正从实验性集成迈向生产就绪的关键拐点。随着《人工智能监管框架࿰…...
终极减法:在亚马逊,为何“显而易见”是穿透信息洪流的唯一利器
在今天这个信息爆炸的时代,尤其是在亚马逊这片被海量商品和广告淹没的平台上,只有那些“显而易见”的简单想法才能真正进入消费者心智,并驱动购买。 试图传递过多、过复杂的信息,反而会成为阻碍成功的最大障碍。然而,…...
3步掌握AI到PSD矢量导出的终极指南:Ai2Psd让设计协作不再有壁垒
3步掌握AI到PSD矢量导出的终极指南:Ai2Psd让设计协作不再有壁垒 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 在当今跨软件设计…...
