5. 类加载子系统

在这里插入图片描述

一、前言

前面我们了解了字节码文件的大致组成部分,那么 JVM 是如何加载 .class字节码文件的?加载到.class字节码文件后又做了哪些事情呢?

二、类加载子系统初步认识

首先类加载子系统作为虚拟机和外界的一个对接口,主要负责以下几点:

  • 负责从文件或者网络加载 Class 字节流
  • 读取字节码中的信息,存入 JVM 内存中 (方法区)
  • 对字节流进行规范化校验

三、类加载器子系统加载过程

如下图中所示,.class文件最先由类加载器子系统进行处理,而类加载器子系统进行一个类的加载的时候内部大致可分为三个阶段,加载阶段 -> 链接阶段 -> 初始化阶段。见下图

3.1 加载阶段 Loading

这里我就不摘抄书中内容了,用比较通俗的语言描述,这里加载其实就是读取字节流内容到内存中,通过类的全限定名来进行定位,读取到内容后,将所有的静态结构转化为运行时数据结构,然后存储的方法区中,然后生成一个这个类的 java.lang.Class 对象,放入中,作为在方法区中这个类的访问入口。注意这个阶段只负责读和存,不做任何验证处理。加载的过程中,必然会触发父类的加载。

补充说明:Class 实例是如何被创建的。

  • new 实例化
    • A a = new A();
  • 反射
    • Class clzA = Class.forName("com.xxx.xxx.A");
  • 子类加载时作为父类同时加载
  • JVM 启动时,包含 main 方法的主类
  • 1.7 的动态类型语言支持

3.2 链接阶段

  • 验证 Verify
    • 文件格式验证:验证魔数、版本、常量池这些格式相关的数据
    • 元数据验证:这个类是否有父类,以及这个类的父类是不是被 final 修饰,不允许被继承等。主要针对元数据语义方面的校验
    • 字节码校验:这个阶段最为复杂,主要通过数据流分析和控制流分析,确定语义合法,符合逻辑。针对类的方法体(Class 文件中的 Code 属性)进行校验分析,保证方法运行时不出现危害虚拟机安全的行为。
    • 符号引用验证:这个在整个链接阶段中的最后一个阶段,解析阶段中将符号引用转化为直接引用时发生,比如:全限定类名是否能找到该类。

验证和加载并不是线性的关系,并不是先将流信息全部加载完,再去逐行验证,而是交替进行,可以理解为一边读一边校验。注意这里验证的只是针对流文件的内容,静态数据校验,与运行时环境无关,所以目标 Class 对象不一定已经被加载到内存中,符号引用是由字节码规定的。

验证阶段非常重要,但是没必要每次都进行验证,只要通过了之后对程序运行期没有任何影响了。如果程序运行全部代码都已经反复使用和验证过,生成环境的实施阶段可以考虑使用 -Verify:none 参数来关闭大部分类验证措施,以缩短虚拟机类的加载时间。

  • 准备 Prepare
    • 为类中定义的变量分配内存并设置类变量初始值(注意:这里指类变量,static修饰的变量),这里的初始值 “通常情况” 下是数据类型的零值,比如 public static int value = 123;, 那么准备阶段初始值为 0而不是 123。参考下表。
  • **解析 Resolve **
    • 解析是将常量池内的符号引用替换为直接引用的过程,符号引用:一些字面量;直接引用:可以直接指向目标的指针、相对偏移量或者是间接定位到目标的句柄。
    • 类\接口解析、字段解析、方法解析、接口方法解析

3.3 初始化阶段

执行类构造器 <clinit>()方法。此方法是执行过程中,由编译器自动收集类中的所有变量的赋值动作静态代码块static{}块)中的语句合并产生的。编译器收集的顺序是语句在源文件中出现的顺序决定的,所以静态代码块中只能访问到定义在之前的变量,定义在后面的变量,只能进行赋值,不能访问。

执行过程的本质:

  • 对静态变量赋值以及执行静态代码块
  • 子类初始化过程会优先执行父类的 <clinit>()
  • 没有静态变量及静态代码块(static{}) 就不会产生 <clinit>()
  • 设置启动参数-XX: +TraceClassLoading查看类加载过程
  • <clinit>()方法会默认增加同步索确保只执行一次

四、总结

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 写作(六):核心技术与多元应用(6/10)

一、AI 写作的核心技术概述 AI 写作在当今数字化时代正发挥着越来越重要的作用。它不仅极大地提高了写作效率&#xff0c;还为不同领域带来了创新的可能性。 AI 写作的核心技术主要包括基于模板的文本生成和基于深度学习的文本生成。基于模板的文本生成通常依赖预先设定的模板…

Java-如何实现实现两个异步带有@Async注解的方法按顺序执行

要实现两个带有 @Async 注解的方法按顺序执行,可以使用 CompletableFuture 来管理异步任务 的依赖关系。下面是一个完整的示例,展示了如何确保 method1 执行完成后,再执行 method2。 import org.springframework.scheduling.annotation.Async; import org.springframework…

显卡驱动版本过低怎么办?显卡驱动升级的方法

显卡驱动程序是计算机与显卡之间沟通的桥梁&#xff0c;它负责将操作系统发出的指令翻译成显卡可以理解的语言&#xff0c;从而确保图形显示的流畅与高效。当您遇到显卡驱动版本过低的问题时&#xff0c;升级驱动程序不仅能够提升电脑的图形处理能力&#xff0c;还能解决兼容性…

Qt 环境实现视频和音频播放

在这个示例中&#xff0c;我们将使用 FFmpeg 进行视频和音频的解码&#xff0c;并使用 Qt 的界面进行显示和控制。为了实现音频和视频的解码以及同步显示&#xff0c;我们需要使用 FFmpeg 的解码库进行视频和音频解码&#xff0c;使用 Qt 的 QLabel 显示解码后的视频帧&#xf…

java导出word文件(手绘)

文章目录 代码细节效果图参考资料 代码细节 使用的hutool的WordUtil&#xff0c;WordUtil对poi进行封装&#xff0c;但是这一块的官方封装的很少&#xff0c;很多细节都没有。代码中是常见的绘制段落&#xff0c;标题、表格等常用api Word07Writer writer WordUtil.getWriter(…

UML的另一个主角——用例图

顺序图和类图已经出过单集&#xff0c;本贴要分享的是用例图。 类图https://blog.csdn.net/jsl123x/article/details/143526286?spm1001.2014.3001.5501顺序图https://jslhyh32.blog.csdn.net/article/details/134350587 目录 一.系统 二.参与者 1.主要参与者 2.次要参与…

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)

《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;1&#xff09; 《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;1&#xff09;理解TCP和UDPTCP/IP协议栈TCP/IP协议的诞生背景链路层网络层T…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】&#xff0c;提供一个MATLAB例程&#xff0c;仅以速度为观测量的SINS/GNSS组合导航&#xff08;滤波方式为UKF&#xff09; 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程&#xff1a;使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

【Vue】Vue3.0(十七)Vue 3.0中Pinia的深度使用指南(基于setup语法糖)

上篇文章&#xff1a; 【Vue】Vue3.0&#xff08;十一&#xff09;Vue 3.0 中 computed 计算属性概念、使用及示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月10日15点23分 文章…

通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS

因为 C 具有跨平台的特性&#xff0c;所以有些需求一套代码就多端使用&#xff0c;比如我最近在学习的 OpenGL ES。 但是&#xff0c;不同平台还是具有一定差异性&#xff0c;所以我们首先得判断出是什么平台&#xff1f; 比如 iOS 系统和 Android 系统。 那么如何判断呢&…

工程认证导向的Spring Boot计算机课程管理平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于工程教育认证的计算机课程管理平台的相…

跨境云专线:构建高速、安全的全球业务网络

在企业出海加速的背景下&#xff0c;越来越多的企业需要在全球范围内部署业务&#xff0c;特别是在多个国家和地区之间进行数据传输。然而&#xff0c;跨境网络连接常常面临带宽不足、延迟高、数据安全性差等问题&#xff0c;这给企业的业务运营带来了巨大挑战。为了解决这些问…

分布式——BASE理论

简单来说&#xff1a; BASE&#xff08;Basically Available、Soft state、Eventual consistency&#xff09;是基于CAP理论逐步演化而来的&#xff0c;核心思想是即便不能达到强一致性&#xff08;Strong consistency&#xff09;&#xff0c;也可以根据应用特点采用适当的方…

【后端速成Vue】模拟实现翻译功能

前言&#xff1a; 本期将会介绍 Vue 中的 watch 侦听器&#xff0c;它语法是怎么样的呢&#xff1f;具有怎样的功能呢&#xff1f;最后用模拟实现百度翻译来更进一步练习 watch 侦听器 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、认识翻…

UE5.4 PCG 获取地形Layer

使用AttributeFilter&#xff1a;属性过滤器 节点 设置地形Layer名称和权重 效果&#xff1a;

使用wordpress搭建简易的信息查询系统

背景 当前有这样的一个需求&#xff0c;要实现让客户能够自助登录系统查询一些个人的信息&#xff0c;市面上没有特别符合我的需求的产品&#xff0c;经过一段时间的研究&#xff0c;想出了一个用wordpress实现简易信息查询系统&#xff0c;有两种方式。 方式一&#xff1a;使…

EasyUI弹出框行编辑,通过下拉框实现内容联动

EasyUI弹出框行编辑&#xff0c;通过下拉框实现内容联动 需求 实现用户支付方式配置&#xff0c;当弹出框加载出来的时候&#xff0c;显示用户现有的支付方式&#xff0c;datagrid的第一列为conbobox,下来选择之后实现后面的数据直接填充&#xff1b; 点击新增&#xff1a;新…

ssm079基于SSM框架云趣科技客户管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;客户管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本客户管理系统就是在这…

PICO+Unity 用手柄点击UI界面

如果UI要跟随头显&#xff0c;可将Canvas放置到XR Origin->Camera Offset->Main Camera下 1.Canvas添加TrackedDeviceGraphicRaycaster组件 2.EventSystem移动默认的Standard Input Module&#xff0c;添加XRUIInputModule组件 3.&#xff08;可选&#xff09;设置射线可…

dbt 数据分析工程实战教程(汇总篇)

最近陆续写了数据分析工程相关的系列博客&#xff0c;主要包括dbt-core相关的实战教程。本文是阶段性整理回顾&#xff0c;希望为你学习数据工程领域知识提供帮助&#xff0c;后续会持续更新。 数据工程理论 介绍数据工程基础理论&#xff0c;包括数据仓库、数据建模等内容。结…