【JVM基础08】——类加载器-说一下类加载的执行过程?

目录

  • 1- 引言:类加载的执行过程
    • 1-1 类加载的执行过程是什么?(What)
  • 2- ⭐核心:详解类加载的执行过程(How)
    • 2-1 加载——>加载到运行时数据区
    • 2-2 验证——>类的安全性检查
    • 2-3 准备——>为类变量分配内存并设置初始值
    • 2-4 解析——>把类中的符号引用转为直接引用
    • 2-5 初始化——>对静态变量和静态代码块进行初始化
    • 2-6 使用
    • 2-7 卸载
  • 3-小结
    • 3-1 类装载的执行过程


1- 引言:类加载的执行过程

1-1 类加载的执行过程是什么?(What)

  • 类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:①加载、②验证、③准备、④解析、⑤初始化、⑥使用和 ⑦卸载这 7 个阶段。其中,验证,准备和解析这三个部分统称为连接(linking)

image.png


2- ⭐核心:详解类加载的执行过程(How)

2-1 加载——>加载到运行时数据区

image.png

  • 通过类的全民,获取类的二进制数据流
  • 解析类的二进制数据流为方法区内的数据结构(Java类模型)
  • 创建 java.lang.Class 类的实例,表示该类型。作为方法区这个类的各种数据的访问入口

举例说明

  • 假设现在有一个 Person 类,当 Person 类被加载之后就会存到 JVM 的运行时数据区,主要涉及运行时数据区的两个部分进行存储。
    • ① 方法区/元空间:存储的是这个类的信息,比如 Person 类的构造函数、方法、字段等信息。其实就是目前的元空间
    • ② 堆:堆中会开辟一段空间去存储当前类的 Class 对象,用于创建具体的 Class 对象时使用。比如此时创建了两个实例对象 ,此时这两个实例对象的对象头都会指向当前这个 Class 对象。但具体的类的构造函数、方法、字段等信息,需要到方法区中去获取,此时堆中的 Class 对象就可以找到方法区中的的这些类信息。

image.png


2-2 验证——>类的安全性检查

image.png

  • ①主要是格式检查,检查文件格式是否错误、语法是否错误、字节码是否合规
  • ②符号引用验证:Class文件在其常量池会通过字符串记录自己将要使用的其他类或方法,检查他们是否存在

验证主要负责检查类是否符合 JVM 规范

  • (1)文件格式验证
  • (2)元数据验证
  • (3)字节码验证
  • (4)符号引用验证

image.png


2-3 准备——>为类变量分配内存并设置初始值

准备阶段主要是对类的变量进行复制,也就是带有 static 关键字的变量。赋值情况主要分为以下三种

  • ① static 变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
    • 比如 static int b = 10赋默认值是 0 ,在初始化阶段才赋值为 10
  • ② static 变量是 final 的基本类型,以及字符串常量,值已经确定,赋值在准备阶段完成
    • 比如 下面代码中的变量 c 和 d ,带了 final 修饰符,此时在准备阶段就完成了赋值
  • ③ static 变量是 final的 引用类型,那么赋值也会在初始化阶段完成
    • 比如 static final Object obj = new Object(),其中 Object 是引用数据类型,因此在初始化阶段才会完成赋值
public class Application {static int b = 10;static final int c = 20;static final String d = "hello";static final Object obj = new Object();
}

2-4 解析——>把类中的符号引用转为直接引用

image.png
比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法。
image.png

  • 符号引用(Symbolic Reference):这是一种抽象的引用形式,使用一组符号来描述所引用的目标。它可以是任何形式的字符串描述,如完全限定名、方法名称和描述符组合等。符号引用并不直接指向对象在内存中的地址。
  • 直接引用(Direct Reference):这是转换后的引用,直接指向目标的内存地址或者对目标的直接指针。直接引用是在解析阶段生成的,当符号引用被第一次使用时,它会被转换为直接引用。

解析是指将类文件中的符号引用转换为直接引用的过程。这个转换过程是 JVM 执行的一部分,确保了程序的执行效率和安全性。


2-5 初始化——>对静态变量和静态代码块进行初始化

image.png

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
  • 如果通过子类访问父类的静态变量,则此时只会初始化父类的静态变量,而不会初始化子类。

2-6 使用

JVM 开始从入口方法开始执行用户的程序代码

  • 调用静态类的成员信息(比如:静态字段、静态方法)
  • 使用 new 关键字为其创建对象实例

2-7 卸载

  • 就是说当用户程序代码执行完毕之后, JVM 就开始销毁创建的 class 对象了,这时候就相当于把类已经给卸载了。

3-小结

3-1 类装载的执行过程

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3268319.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql explain 优化解析

explain 解释 select_type 效率对比 MySQL 中 EXPLAIN 语句的 select_type 列描述了查询的类型,不同的 select_type 类型在效率上会有所差异。下面我们来比较一下各种 select_type 的效率: SIMPLE: 这是最简单的查询类型,表示查询不包含子查询或 UNION 操作。 这种查询通常是…

html+css 实现水波纹按钮

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…

python机器学习8--网络

1.超文本传输协议HTTP GET 在实际开发应用程序时,一定都会利用WiFi网络进行连接,再通过HTTP的方式读入后台的数据,并下载和显示在用户的PC上。这靠的是网络服务的技术,也就是大家提到的Web Service。而与HTTP服务器交换数据有两种…

STM32-寄存器时钟配置指南

目录 启动 SystemInit SetSysClock 总结 启动 从startup_stm32f0xx.s内的开头的Description可以看到 ;* Description : STM32F051 devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the in…

Java解析epub电子书文件实战demo

如何使用 Java、Spring Boot 和 Epublib 库解析存储在阿里云对象存储服务(OSS)上的 EPUB 文件。这里将指导您完成设置必要依赖项、配置 OSS 客户端以及编写服务以读取和提取 EPUB 文件章节的全过程。 步骤1:添加依赖项 首先,将 E…

08 字符串和字节串

使用单引号、双引号、三单引号、三双引号作为定界符(delimiter)来表示字符串,并且不同的定界符之间可以相互嵌套。 很多内置函数和标准库对象也都支持对字符串的操作。 x hello world y Python is a great language z Tom said, "Le…

【ESP01开发实例】-ESP-01开发环境搭建与固件烧录

ESP-01开发环境搭建与固件烧录 文章目录 ESP-01开发环境搭建与固件烧录1、ESP-01介绍2、开发环境搭建3、固件下载3.1 使用 Arduino UNO 板对 ESP8266 (ESP-01) 模块进行编程3.2 使用USB 转串口转换器对 ESP8266 (ESP-01) 模块进行编程4、点亮LED本文将详细介绍如何使用 Arduino…

springboot在加了mapper之后报错

springboot在加了mapper之后报错 最后发现是spring boot版本不兼容,spring-boot-starter-parent换成3.0.5之后可以了

Asp .Net Core 系列:详解授权以及实现角色、策略、自定义三种授权和自定义响应

什么是授权(Authorization)? 在 ASP.NET Core 中,授权(Authorization)是控制对应用资源的访问的过程。它决定了哪些用户或用户组可以访问特定的资源或执行特定的操作。授权通常与身份验证(Auth…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注:微信公…

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

OpenSSL学习笔记及在项目中的使用

OpenSSL官方命令手册&#xff1a;OpenSSL commands - OpenSSL Documentation 参考教程&#xff1a; 操作&#xff1a;OpenSSL的基本使用教程(一&#xff09;_openssl.exe使用教程-CSDN博客 操作&#xff1a;Linux和Shell回炉复习系列文章总目录 - 骏马金龙 - 博客园 (cnblog…

vscode 调试web后端

1、调试环境配置 一、安装python环境管理器 其中要先在vscode选择对应的python环境&#xff0c;最方便的是按照环境管理器后从中选择。其中在【externsions】里面安装python即可。 如下&#xff1a; 二、编写launch.json文件 其中如下&#xff1a; {// Use IntelliSense …

从丢失到找回:2024年U盘数据恢复软件全攻略

优盘作为我们日常短时间存储分享数据来说非常方便&#xff0c;毕竟小巧便携。但是也正因为他小巧数据很容易丢失&#xff0c;如果有备份还好&#xff0c;没有备份就麻烦了。但是只要掌握U盘数据恢复方法就可以缩小我们的损失。 1.福foxit昕数据恢复工具 一键直达>>http…

【算法题】颜色分类,一文彻底搞会!

目录 一、题目描述 二、解题思路 1、什么是荷兰国旗问题&#xff1f; 2、如何解决荷兰国旗问题&#xff1f; 三、参考答案 一、题目描述 颜色分类 给定一个包含红色、白色和蓝色、共n个元素的数组nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&am…

【电源专题】结合锂电池相关资料和华为手机聊聊锂离子电池使用条件限制

在文章:【电源专题】锂电池的特点和工作原理 中我们讲到了一些关于锂电池种类和特点、工作原理等。但是对于锂离子电池使用条件限制却没有介绍,本文基于手机产商 锂离子电池使用条件-电池性能和应用介绍 | 华为官网 (huawei.com)提供的介绍文档再次深入学习锂离子电池的一些特…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

【SpringBoot】2 项目搭建

创建项目 1&#xff09;确实本地 jdk 版本 打开命令行窗口&#xff1a;快捷键 Windows R&#xff0c;输入 CMD&#xff0c;敲回车 执行命令&#xff1a;java -version 2&#xff09;在项目 clone 的位置创建 Spring Boot 项目&#xff0c;使用 Maven 进行依赖管理&#xff…

uniapp通过绝对路径解压zpi中的shpe转化为geojson

uniapp通过绝对路径解压zpi中的shpe转化为geojson async fileResult() {const filepath11 /storage/emulated/0/importData/Export_Output_6.zip;// Base64解码函数function base64ToArrayBuffer(base64) {const binaryString atob(base64.split(,)[1]);const len binaryStr…

【计算机网络】DHCP实验

一&#xff1a;实验目的 1&#xff1a;深入理解DHCP&#xff08;动态主机配置协议&#xff09;的工作原理和数据包交换过程。 2&#xff1a;掌握如何通过命令行释放和重新获取IP地址&#xff0c;并通过抓包软件分析DHCP消息的具体内容。 二&#xff1a;实验仪器设备及软件 硬…