jvm类加载子系统之链接阶段

JVM - 1.类加载子系统 1.Java开发可以自定义类加载器,定制类的加载方式2.自定义类加载器的优势1.隔离加载类(不同中间件的加载是隔离的,确保加载jar包时相同名称的路径不会冲突)2.修改类加载的方式(修改为需要的时候动态的加载)3.扩展加载源(本地磁盘,网络,扩展其他加载源)4.防止源码泄露(自定义类加载器实现加密解密)3.实现步骤1.通过继承抽象类的方式,实现自定义类加载器2.JDK1.2之前,自定义类加载器会去继承类并重写方法,从而实现自定义的类加载类3.JDK1.2之后,不建议覆盖。 阅读详情


前言

语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd

验证(Verify)

目的:验证的目的是保证.class文件的字节流中信息符合当前虚拟机的要求,保证加载类的正起行,不会危害虚拟机的自身安全。
验证大体分为四步格式检查、语义检查、字节码验证、符号引用验证,验证阶段并不是单独存在的模块,验证阶段穿插在加载和解析阶段之中完成。
在这里插入图片描述

  • 其中格式检查会在加载阶段穿插执行,只有通过格式认证的字节码才会被加载到方法区
  • 格式验证之外的其他验证都在方法区完成,验证阶段虽然拖慢了加载速度,但是避免了字节码在运行时还需要各种检查,磨刀不误砍柴工。
  • 符号引用验证是在解析步骤时完成,如果验证时发现符号引用不存在直接引用,会出现NoClassDefFoundError或者NoSuchMethodError异常。

准备(Prepare)

  • 为类变量分配内存,并设置其默认值,即零值
  • 为static final修饰的且在常量池中有字面量引用的静态常量赋初始值即常量池中的字面量恒定值
  • 此过程不会为实例变量赋值,实例变量是在实例创建时通过构造方法赋值的,和实例一起保存在堆栈。(当然类变量也在堆里,报存在Class里)
  • 在整个准备阶段都不会设计代码的运行(初始化就会运行方法)。

解析(Resolve)

  • 将类常量池中部分类、接口、方法、字段的符号引用转换成直接引用

静态链接和动态链接

上面这句突出了"部分"二字,是因为解析过程并不会将全部符合引用都替换成直接引用。解析又成静态链接,与其相对是动态链接作用都是将常量池中的符号引用替换为直接引用,动态链接是栈桢的一部分,"栈管运行,堆管存储"既然是栈桢的一部分那动态链接生效的时机就是在方法运行的时候。

  1. 静态链接(解析):编译期能确定的符号引用会被转换为直接引用,如果符号引用对应的直接引用不存在在类加载时就会包错。
  2. 动态链接:由于java支持多态子类可以实现和重写接口或父类中的方法,而为了降低代码的耦合性面向接口编程是必不可少的,所以很多方法在编译期无法确定其真正的直接引用,所以才有了动态链接,在运行时动态获取其方法的直接引用。所以如果一行代码采用动态链接方式获取直接引用,只要这行代码不执行即便此行代码对应的常量池符号引用无直接引用也不会抛出错误。

在java中有字节码中的常量池、运行时常量池、字符串常量池好三种常量池,这里的常量池指的又是什么呢?可以看下java的常量池。

【JVM】java的jvm类加载器和类加载子系统 获取在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行折,在必要时,我们还可以自定义类加载器,来定制类的加载方式。那为什么还需要自定义类加载器呢?隔离加载类(比如现在的Spring框架和RocketMQ有包名路径完全一样的类,类名也一样,这个时候类就冲突了。所以允许用户自定义类的加载器。不过现在一般的主流框架和中间件都会自定义类加载器,实现不同的类加载,中间件之间是隔离的);扩展加载源(还可以考虑从数据库中加载类,路由器等不同的地方);防止源码泄漏。 阅读详情

相关推荐

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 240

9.链接阶段

9、链接阶段 链接是将各种代码和数据部分收集起来并合并为一个单一文件的过程,该文件最后被加载到存储器中并运行。 链接可以执行于编译时,由静态链接器完成;也可以执行于加载和运行时,由动态链接器完成。可以看出链接器在软件开发中扮演一个关键的角色,它使得分离编译成为可能。在我们开发一个大型程序的时候,通用的做法是将它分解为更小、更好管理的模块,独立地修改和编译这些模块,当改变其中的一个模块时只需

badman250的专栏 3万+

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6556

八、链接阶段

C/C++编译技术

adminstate的博客 505

百度慧眼人口位置数据:从原理到实战的GIS处理全流程

本文详细解析百度慧眼人口位置数据的处理全流程,从基本原理到实战应用。通过空间网格划分、终端数量统计等技术手段,百度慧眼数据能准确反映人群分布特征。文章涵盖坐标系转换、核密度分析、热力图制作等GIS处理技巧,并分享商业选址、城市规划等典型业务场景的解决方案,帮助读者高效利用这一数据资源。

weixin_30872157的博客 531

ESP32-S3驱动PCA9685模块:I2C扩展16路舵机控制实战指南

本文提供了ESP32-S3通过I2C总线驱动PCA9685模块扩展16路PWM输出的完整实战指南。详细解析了PCA9685模块原理、硬件连接、I2C地址配置,并给出了核心驱动代码与角度控制函数,帮助开发者解决微控制器PWM引脚不足的问题,轻松实现多路舵机控制。

weixin_32005771的博客 514

JVM工作原理与实战(六):类的生命周期-连接阶段

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的连接阶段等内容。

Rye的博客 1819

量化交易python代码解析:从狙击手算法到最优限价算法

在金融市场的竞技场上,量化交易如同一位冷静的策略大师,它以数学模型为剑,以计算机程序为盾,精准出击,捕捉市场的微妙波动。本文将深入探讨五种核心量化交易算法:直接委托算法(DMA)、时间加权平均算法(TWAP)、冰山算法(Iceberg)、狙击手算法(Sniper)、条件委托算法(Stop)以及最优限价算法(BestLimit),揭开它们背后的运作机制与实战应用。

木头大左的博客 1884

JVM类的生命周期之连接阶段

解析阶段主要是将常量池中的符号引用替换为直接引用。字节码文件中使用编号来访问常量池中的内容, 将类加载入内存后,直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。3.验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。虽然为静态变量value赋值1,但在准备阶段,并不会赋值为1,而是初始化为0;4.符号引用验证,例如是否访问了其他类中private的方法等。变量,准备阶段直接会将代码中的值进行赋值。连接阶段分为三个字阶段:验证、准备、解析。1、为静态变量分配内存并分配。

qq_55781039的博客 182

Python爬虫实战:抓取CVE安全漏洞数据库

在网络安全领域,CVE(Common Vulnerabilities and Exposures)是一个非常重要的安全漏洞字典,它为每个安全漏洞提供了唯一的标识符。安全研究人员、开发人员和系统管理员都需要及时了解最新的CVE信息,以便采取相应的防护措施。本文将详细介绍如何使用Python爬虫技术从专业CVE网站抓取漏洞数据,并构建一个完整的CVE信息采集系统。本文详细介绍了如何使用Python爬虫技术从专业CVE网站抓取安全漏洞数据。多种爬虫技术反爬虫策略:User-Agent轮换、代理IP、请求延迟。

2201_76125261的博客 366

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

链接(Linking)阶段

Verification(验证):保证加载的字节码是符合规范的。 验证的过程比较琐碎,也比较复杂。大致分为4个阶段 格式检查 语义检查 字节码验证 符号引用验证 ----魔数检查、版本检查、长度检查 ----是否继承final、是否有父类、抽象方法是否有实现 ----跳转指令是否指向正确的位置、操作数据的类型是否正常 ----符号引用的直接引用是否存在 注意: 验证阶段无法通过检查,虚拟机不会正确加载这个类。但是通过了这个阶段的检查,这个类仍然有可能有问题。 Preparation(准

qq_42185762的博客 475

python实现Markowitz模型 (附完整源码)

python实现Markowitz模型 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 402

JVM类加载子系统的流程(加载阶段、链接阶段和初始化阶段)

一、类加载子系统的作用 1.类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 2.ClassLoader只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine(执行引擎)决定。 3.加载的类信息存放在一块成为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 举例:类加载.........

a2321123的博客 690

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

让宝贝舍友理解JVM 第二弹 上(类加载子系统)

这篇文章我们就开始学习JVM第一个结构,类加载子系统。

weixin_44824500的博客 1052

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

5. 类加载子系统

前面我们了解了字节码文件的大致组成部分,那么 是如何加载 字节码文件的?加载到字节码文件后又做了哪些事情呢?首先类加载子系统作为虚拟机和外界的一个对接口,主要负责以下几点:如下图中所示,文件最先由类加载器子系统进行处理,而类加载器子系统进行一个类的加载的时候内部大致可分为三个阶段,加载阶段 -> 链接阶段 -> 初始化阶段。见下图这里我就不摘抄书中内容了,用比较通俗的语言描述,这里加载其实就是读取字节流内容到内存中,通过类的全限定名来进行定位,读取到内容后,将所有的静态结构转化为运行时数据结构,然后存储的

工作学习总结,技术分享 741

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一文理解JVM的类加载系统

}该类是如何一步步被加载的呢?加载的过程如下所示:第一步:加载阶段,字节码文件会以文件流的形式输入,JVM会读取并加载这些字节码文件。第二步:链接阶段,对字节码进行验证、初步的处理,并将常量池内的符号引用转换为直接引用等等。第三步:初始化阶段,这一阶段主要是创建对象了。每个阶段又有更具体的功能,如下图所示:接下来,我们先介绍每个组件的功能,然后再从源码等角度来看整个系统是如何工作的。

纵横千里 捭阖四方 的专栏 453

JVM类加载子系统

JVM的整体结构 类加载子系统 类的加载指的是将类的.class文件中二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。类加载的最终产品是位于堆区中的class对象,Class对象封装了类在方法区内的数据结构,并向Java程序员提供了访问方法区内的数据机构的接口. 我们可以通过类名.class来获取一个类的类型的引用,通过new 类名().getClass()来获取一个实例变量的类的引用 类加载子系统分为三个

是小D吖!的博客 322

2.类加载子系统

完整图如下如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类修改类加载的方式扩展加载源防止源码泄漏开发人员可以通过继承抽象类ava.1ang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。

The_flying_pig的博客 1106

JVM基础

基于栈的指令集架构基于寄存器的指令集架构。

qqqwx_111115的博客 1836

JVM 类加载子系统在干什么?

JVM 类加载子系统在干什么?

liuruiaaa的博客 990

.net core 字符串取消符号_「面向 Boss 编程」JVM 链接阶段之符号引用与直接引用...

JVM 架构简图JVM 的类加载子系统(Class Load SubSystem) 是 JVM 架构的第一个重要阶段,我们最常见的 JVM 架构简图是下面这样事儿的,只瞅一眼就跟明镜儿似的,类加载子系统的责任那是明明白白的,负责从文件系统或网络中加载 class 文件到 JVM 运行时数据区。JVM 架构简图 类的加载过程既然都这么明确了,那只能不绕圈子了,其实类加载子系统还是有点复杂的,并不像上...

weixin_39758288的博客 216

JVM复习之类加载子系统

类加载子系统 所处JVM中的位置 类加载子系统图 类加载子系统的作用 类加载子系统负责从文件系统或网络中加载Class文件,class文件在开头有特定的文件标识(CAFE BABY) ClassLoader只负责class文件的加载,至于运行与否,取决于执行引擎。 加载的类信息存放在方法区的内存空间中。其中除了保存类信息外,还会存放运行时常量池信息,字符串字面量和数字常量等。 链接阶段 验证: 确保Class文件中字节流包含信息符合虚拟机要求。包括四种验证:文件格式、元数据、字符码、符号引用。

qq_41570752的博客 168

JVM-类加载子系统

本文和大家聊聊 JVM 的基本概念和类加载子系统。

DC1020的博客 1296

类加载子系统之类的生命周期(待完善)

文中大量图片来源于。

逸枚俗人的博客 443
上一篇: 类加载时JVM在搞什么?JVM源码分析+OOP-KLASS模型分析
下一篇: java的常量池
躺平程序猿
博客等级 码龄8年 4870粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值