当前位置: 首页 > news >正文

JVM专题四:JVM的类加载机制

Java中类的加载阶段

类加载

Java中的类加载机制是Java运行时环境的一部分,确保Java类可以被JVM(Java虚拟机)正确地加载和执行。类加载机制主要分为以下几个阶段:

  1. 加载(Loading):这个阶段,JVM会通过类加载器(ClassLoader)读取类的二进制数据(.class文件),并将其转换为方法区中的运行时数据结构。这个过程涉及到类的名称查找和字节码的加载。

  2. 验证(Verification):在链接阶段的第一步,JVM会确保加载的类符合JVM规范,没有安全问题。这个过程会检查字节码的格式是否正确,确保类的结构符合规范,比如确保所有方法调用都是有效的,没有非法访问等。

  3. 准备(Preparation):这个阶段,JVM会为类的静态变量分配内存,并设置默认初始值。比如,对于静态变量int x = 10;,JVM会在准备阶段为x分配内存,并将其初始化为0(因为10是一个编译时常量,所以最终的值会在初始化阶段被设置)

  4. 解析(Resolution):这个阶段涉及到将类、接口、字段和方法的符号引用转换为直接引用。符号引用是类文件中的一个名字,而直接引用是指向内存中的地址。解析过程确保了所有的符号引用都可以被正确地解析到它们所引用的实际对象。

  5. 初始化(Initialization):最后,JVM会执行类的构造器<clinit>()方法,这会按照代码中的顺序来初始化静态变量和静态初始化块。在这个阶段,静态变量会被赋予它们在代码中指定的值。

        整个类加载过程是由类加载器负责的,类加载器是Java运行时环境的一部分,负责加载.class文件,并确保类可以被JVM执行。类加载器还负责处理类之间的依赖关系,确保在加载一个类之前,它所依赖的类已经被加载。

Java类加载实例

public class App {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();}|

加载

        上述代码我简单改了下springboot的启动类,当我们运行main方法之间,类加载器会将App.class文件加载到JVM中,当运行main方法执行第一段代码的时候,就会将SpringApplication.class文件加载到JVM中,简单流程如下图。

好了,介绍完加载阶段我们思考一个小问题;如果我们随随便便给一个文件改个后缀名未.class文件那JVM还会处理吗?因此进入下一个阶段:

验证阶段

        上个阶段的问题答案肯定是否定的嘛?Java虚拟机会对class文件进行的规范约束,只有符合规范的文件才会被JVM处理。

通过验证以后的class文件才会进行处理,于是进入下一个阶段:

准备阶段

上述代码我们只有一个方法,实际很多类会有一些类变量,比如我们将上述代码改成:

public class App {public static int starter;public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();}|

上述代码,假设我们是正常编码确认App.class是规范的即通过了验证阶段,便会进入准备工作。

这个阶段其实就是给这个“App”类分配一定内存空间给他的类变量分配内存并设置类变量的默认初始值如上述starter经过准备阶段会给一个’0‘的初始值,

类变量使用的内存都在方法区中分配。(这里提到初始化的是类变量,即static字段修饰,实例变量会在对象实例化时随对象一起分配在Java堆中。)

整个过程如下图:

解析阶段

这个阶段最最最主要的操作就是将符号引用替换为直接引用(类或接口、字段、类方法、接口方法、方法类型、方法句柄和访问控制修饰符7类符号引用),其实这部分实际都是由JVM底层处理的,涉及到c的处理过程。先不讨论,后面会抽一个专门说java与c的交互。

整个阶段就变成如下图:

符号引用与直接引用

        符号引用(Symbolic Reference) 是一种用来表示引用目标的符号名称,比如类名、字段名、方法名等。符号引用与实际的内存地址无关,只是一个标识符,用于描述被引用的目标,类似于变量名。符号引用是在编译期间产生的,在编译后的class文件中存储。

        直接引用(Direct Reference)是程序运行时JVM生成的,直接指向内存中对象或方法的实际地址的引用。这个过程涉及到查找类、接口、字段、方法等在内存中的实际位置(类似:0xfbe007)。

这稍微注意下上述三个阶段,我们会统一称之为链接阶段。

链接阶段需要重点注意的是准备阶段,在这个过程中我们给加载进来的内分配好了内存空间,类的变量也同样分配好了内存空间,并且给了默认初始值。这里再次强调一下后续会讨论分配内存空间时候各种情况,大家也可以自行思考下例如内存不够了咋整?多个人分配的地址重复了又该咋整呢?

初始化

上述我们在类加载的准备阶段给类的变量分配好内存空间后给类给的是默认值,而在初始化阶段就会正真执行类初始化代码

public class App {public static int starter = config.getStarter(); public static List<EnableAutoConfiguration> autoConfigurations;static {loadSpringFacotories();}public static void loadSpringFacotories(){autoConfigurations = new ArrayList();}public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();}}

所以上述代码如果我们分不同阶段去获取starter其实会得倒不同的值,在加载进行到准备阶段我们得到的只会是0,而当我们在初始化后再去获取starter会获得到config.getStarter()方法返回的值。

当然这个阶段也会执行静态代码块里的方法,上述代码中的loadSpringFacotories()方法也是这个阶段调用的。

那什么时候会初始化一个类呢?通常有以下几个场景:

1、new的时候会将new后面的class文件从最开始的加载到初始化整个完整的过程都会执行一边,然后在实例化一个对象出来。

2、当执行一个入口函数如main(),就会把main所在的主类立马初始化

3、初始化一个类的时候发现他的父类没有初始化,那么就会先初始化他的父类。

结合例子我们最终完成整个加载过程的介绍,和第一个章节的知识点介绍,大家可以对比画出自己的图。

今天类加载机制到此就要结束了,后面我们会介绍类加载器与双亲委派机制;到时候加上类加载器上图又会变成怎样呢?

 专题汇总

JVM专题一:深入分析Java工作机制

JVM专题二:Java如何进行编译的

JVM专题三:Java代码如何运行

JVM专题四:JVM的类加载机制

JVM专题五:类加载器与双亲委派机制

JVM专题六:JVM的内存模型

JVM专题七:JVM垃圾回收机制

JVM专题八:JVM如何判断可回收对象

JVM专题九:JVM分代知识点梳理

JVM专题十:JVM中的垃圾回收机制

JVM专题十一:JVM 中的收集器一

JVM专题十二:JVM 中的收集器二

JVM专题十三:总结与整理(面试常用)

相关文章:

JVM专题四:JVM的类加载机制

Java中类的加载阶段 类加载 Java中的类加载机制是Java运行时环境的一部分&#xff0c;确保Java类可以被JVM&#xff08;Java虚拟机&#xff09;正确地加载和执行。类加载机制主要分为以下几个阶段&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;这个阶段&#x…...

Python爬取中国天气网天气数据.

一、主题式网络爬虫设计方案 1.主题式网络爬虫名称 名称&#xff1a;Python爬取中国天气网天气数据 2.主题式网络爬虫爬取的内容与数据特征分析 本次爬虫主要爬取中国天气网天气数据 3.主题式网络爬虫设计方案概述&#xff08;包括实现思路与技术难点&#xff09; reques…...

EXCEL快速填充空白内容

** EXCEL快速填充空白内容 ** 1.全选所有需要填充的内容&#xff0c;按住电脑的F5或者CTRLG点击定位 2.可以看到空白处被自动选定&#xff0c;之后按电脑和⬆&#xff0c;最后CTRLenter 可以看到空白处已经被填充。...

CBSD创建和管理bhyve容器Ubuntu@FreeBSD

bhyve介绍&#xff1a;bhyve&#xff1a;FreeBSD下的原生虚拟机管理器_freebsd 虚拟化平台bhyve-CSDN博客 两个bhyve的管理软件&#xff1a;使用bvm管理bhyve虚拟机管理系统FreeBSD-CSDN博客 vm-bhyve&#xff1a;bhyve虚拟机的管理系统FreeBSD-CSDN博客 现在&#xff0c;我…...

STM32开发实战:SPI接口在W25Q64 Flash存储器中的应用

摘要 本文将深入探讨STM32微控制器如何利用SPI接口与W25Q64 Flash存储器进行通信。W25Q64是一款常用的SPI串行Flash存储器&#xff0c;具有8Mbit的存储容量。本教程将指导读者完成硬件连接、SPI配置、读写操作&#xff0c;并提供实际的代码实现。 1. SPI接口概述 SPI是一种串…...

python一些进阶用法:hook 钩子函数以及Registry机制

写在前面 一句话讲&#xff0c;register机制 和 hook 都是函数/类 调用和传参机制的一种灵活运用&#xff0c;将函数作为传参对象&#xff0c;进行回调和封装&#xff0c;通常扩展了或修改了原始函数的行为&#xff1b;这些高级用法都是编程经验中沉淀下来的常用范式&#xff0…...

工作实践:11种API性能优化方法

一、索引优化 接口性能优化时&#xff0c;大家第一个想到的通常是&#xff1a;优化索引。 确实&#xff0c;优化索引的成本是最小的。 你可以通过查看线上日志或监控报告&#xff0c;发现某个接口使用的某条SQL语句耗时较长。 此时&#xff0c;你可能会有以下疑问&#xff…...

正版软件 | WIFbox:智能化文件管理工具,让效率与隐私并行

在数字化办公日益普及的今天&#xff0c;文件管理成为了提升工作效率的关键。WIFbox 一款智能文件管理工具&#xff0c;利用强大的人工智能技术&#xff0c;帮助您快速对文件进行分类&#xff0c;完成复杂的智能文件分类任务。 智能分类&#xff0c;效率倍增 WIFbox 通过精细化…...

Postman接口工具实战

为了更好地展示Postman接口测试的实战过程&#xff0c;我将以一个简单的实战示例来说明如何使用Postman完成一个API的测试。假设我们要测试一个假想的天气查询API&#xff0c;该API允许用户通过城市名查询天气情况。我们将执行以下步骤&#xff1a; 1. 准备工作 确保已经安装…...

江协科技51单片机学习- p17 定时器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

【D3.js in Action 3 精译】前言

早在 2017 年&#xff0c;我还是一名渴望迈出职业生涯关键一步的前端开发者。虽然我很热衷于网站开发&#xff0c;但总感觉缺了点什么。我一直希望自己的工程专业背景和对教学的热爱能与新的编程技能相结合。就在这时&#xff0c;搭档建议我学学数据可视化。出于某种原因&#…...

Java SE入门及基础(58) 并发 进程与线程概念

目录 并发 进程和线程 1. 进程和线程 2. 进程 3.线程 总结 并发 并发(Concurrency) Computer users take it for granted that their systems can do more than one thing at a time. They assume that they can continue to work in a word processor, while other app…...

放松一下,简简单单了

哈哈哈哈哈...

【智能制造-5】数采和电机

既然可以采集PLC的数据&#xff0c;为什么要采集电机的数据&#xff1f; 采集PLC&#xff08;可编程逻辑控制器&#xff09;的数据和采集电机的数据是两个不同的概念和目的。 PLC是用于控制和监控工业自动化过程的设备&#xff0c;它可以接收传感器的输入信号并根据预设的逻辑…...

【软考论文】论信息系统的安全性与保密性设计

目录 一、题目二、论文2.1 摘要2.2 正文三、扩展3.1 信息安全包括5个基本要素3.2 国产秘钥算法3.3 等保(信息安全等级保护)3.4 其他一、题目 在企业信息化推进的过程中,需要建设许多信息系统,这些系统能够实现高效率、低成本的运行,为企业提升竞争力。但在设计和实现这些…...

【图文教程】电脑查看显卡GPU温度方法:小白也能秒懂!

在电脑操作中&#xff0c;显卡是电脑的重要组件之一&#xff0c;其温度控制对于保持系统稳定运行是特别重要的。但是&#xff0c;许多新手用户不知道要怎么操作才能查看电脑显卡CPU的温度&#xff1f;接下来小编给大家介绍三种简单有效的查看显卡温度方法&#xff0c;操作简单&…...

Qt的智能终端项目文档完整版

由于上一篇文章已经把用户端的页面都显示了&#xff0c;这里就不在赘述&#xff0c;就将那个运行在虚拟机上的截图展示下来了&#xff0c;其实这个也就是最后的效果了。目前就是这个&#xff0c;感觉当练手的也还行...

SQL面试题练习 —— 查询最近一笔有效订单

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;字节跳动。 1 题目 现有订单表t_order&#xff0c;包含订单ID&#xff0c;订单时间,下单用户&#xff0c;当前订单是否有效&#xff0c;请查询出每个用户每笔订单的上一笔有效订单 ----------------------------------------…...

分享HTML显示2D/3D粒子时钟

效果截图 实现代码 线上体验&#xff1a;three.jscannon.js Web 3D <!DOCTYPE html> <head> <title>three.jscannon.js Web 3D</title><meta charset"utf-8"><meta name"viewport" content"widthdevice-width,ini…...

Java——IDEA使用

一、IDEA介绍 IntelliJ IDEA 是 JetBrains 公司开发的一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于 Java 编程语言&#xff0c;但也支持多种其他语言和框架。由于其强大的功能和灵活性&#xff0c;IntelliJ IDEA 被广泛应用于软件开发领域&…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...