关于装载类子系统

装载类子系统

  1. 类加载器
  2. 字节码调节器
  3. 类加载运行时数据区

类加载器

将class文件加载进jvm的方法去,并在方法去中创建一个java.lang.Class对象作为外界访问这个类的接口。实现这个动作的代码模块称为类加载器。

类加载器分类

  1. 启动类加载器(Bootstrap ClassLoader)
  2. 扩展类加载器
  3. 应用程序类加载器
  4. 自定义加载器
启动类加载器

它是Java加载系统的根部,它负责加载Java核心类库(JAVA_HOME/jre/lib/rt.jar中的类库),由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不同于其他的类加载器,启动类加载器并不继承自java.lang.ClassLoader类。

扩展类加载器

这是一个由Sun的Extension ClassLoader实现的,它负责加载Java的扩展库
(JAVA_HOME/jre/lib/ext或者由系统变量java.ext.dirs指定路径中的类库)

开发者可以直接使用标准扩展目录(ext目录)做类库的扩展。

应用程序类加载器

这是ClassLoader中getSystemClassLoader()方法的返回值,所以也称为系统类加载器
它负责加载环境变量CLASSPATH或者-classpath/-cp命令行选项指定路径中的类库。该类加载器是用户自定义加载器的默认父加载器。

自定义加载器

自定义类加载器(Custom ClassLoader):Java允许我们自定义类加载器,只需要继承java.lang.ClassLoader类,并重写findClass方法即可
这样可以让Java类具有动态加载和热加载的能力,提高了Java程序的灵活性。

类加载过程

  1. 加载:
  2. 连接:
    2.1. 验证
    2.2. 准备
    2.3. 解析
  3. 初始化
加载:
  • 加载是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.class对象的过程。
  • 这个过程,将类的.class文件中的二进制数据读入内存,凡在运行时数据区的方法区内。然后就在堆中创建java.lang.class对象,用来封装类在方法去中的数据结构
  • 类加载阶段
  • (1) Java虚拟机将.class文件读入内存,并为之创建一个Class对象。
  • (2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。
  • (3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。
连接:
验证
  • 验证阶段作用是保住Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害。如果验证失败,就会抛出一个java.lang.VerifyError异常或其子类异常。验证过程分为四个阶段:
  • (1)文件格式验证:验证字节流文件是否符合Class文件格式规范,并且能被当前虚拟机正确处理。
  • (2)元数据验证:是对字节码描述信息惊喜语义分析,以保证其描述的信息符合java语言规范要求
  • (3)字节码验证:主要是惊喜数据流和控制流的分析,保证被校验类的方法在运行时不会危害虚拟机
  • (4)符号引用验证:符号引用验证发生在虚拟机将符号转化为直接引用的时候,这个转化动作将在解析阶段发生。
准备
  • 准备阶段为变量分配内存并设置类变量的初始化。这个阶段分配的仅为类的变量,而不包括类的实例变量。对于非final的变量,JVM会将其设置成“零值”,而不是赋值语句的:private static int size = 12 。那么在这个阶段,size的值为0,而不是12.但非final修饰的类变量将会赋值成真实的值。
解析
  • 解析过程是将常量池内的符号引用替换成直接引用,主要包括四类型引用解析。类或接口的解析,字段解析、方法解析、接口方法解析。

初始化:

类加载过程

双亲委派模型

如果一个类接受到请求,他首先将请求交给父类加载器,直至找到启动类加载器,如果父类加载器加载失败,当前类加载器才会自己加载类。

为什么要使用双亲委派模型:防止类重复加载,保护核心的类

字节码校验器

字节码校验器的主要作用是确保加载的字节码文件符合Java虚拟机的规范,不会造成虚拟机的安全问题。它会检查字节码文件的格式、标识符、常量、堆栈、方法和类结构等信息,如果字节码文件不合规范,字节码校验器会拒绝加载该文件。

类加载运行时数据区

类加载运行时数据区的主要作用是存储加载的类的元数据信息合类的字节码等数据。这些信息包括类的名称、访问修饰符、继承关系、接口信息、字段信息、方法信息等。载Java虚拟机执行行字节码时,会使用到这些元数据信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

keycloak18.0.0==本地源码启动

github下载源码, 版本18.0.0 java和maven的版本如下 E:\keycloak-18.0.0>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (build 21.0.112-LTS-…

EMC测试整改:提升产品合规性和市场竞争力?|深圳比创达电子

在当前的产品研发和制造领域,电磁兼容(EMC)测试是确保产品符合法规要求并能够在各种电磁环境下正常工作的重要环节。然而,很多企业在进行EMC测试时可能会遇到一些问题和不合格情况,因此需要进行整改来提升产品的合规性…

leetcode 热题 100_合并区间

题解一: 排序:先将区间按左边界从小到大进行排序,假设排序后a区间在b区间之前,根据a区间右边界和b区间左边界的大小判断是否重叠,如果重叠则将区间合并为一个。考虑到区间完全处于另一区间内的情况,合并时应…

一个数据库表格缺少自动增加的字段导致添加一条数据失败

一个数据库表格缺少自动增加的字段导致添加一条数据失败。最近要整理出一个cms网站源程序,因此新建了一个目录,将需要的文件复制到该目录。复制好以后,试用的时候发现添加留言失败。经过数小时的查找原因,最后找到原因&#xff0c…

JVM-类加载机制

名词解释 *.class文件的结构 查看指令: javap -verbose hello.class 包含信息: 结构信息(版本号,大小信息); 元数据(类,继承,接口,字段声明,方法声…

如何使用宝塔面板搭建Discuz并结合cpolar实现远程访问本地论坛

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board(以下简称 Discuz!)是一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上&a…

京东大佬教你剖析软件测试的底层逻辑

写这篇文章,是希望把我的一些我认为是非常有价值的经验总结出来,能够帮助刚做测试不久的新同事,或者是测试经验丰富的老同事以共享。 希望我们可爱的新同事,准备要在测试领域耕耘的伙伴,能够通过我的文章了解到测试的底…

哪吒监控:开源、轻量、易用的服务器监控、运维工具(内附主题美化代码)

哪吒监控是一款开源、轻量、易用的服务器监控、运维工具,为用户提供了一系列强大的功能和便捷的操作方式。 一键安装:支持一键脚本安装面板和监控服务,适用于Linux、Windows、MacOS、OpenWRT等主流系统,让您轻松上手。 实时监控:能够同时监控多个服务器的系统状态,包括…

Linux --- 应用层 | HTTP | HTTPS

前言 前面写的TCP/UDP客户端在访问服务端的时候,需要输入ip地址和端口号才可以访问, 但在现实中,我们访问一个网站是直接输入的一个域名,而不是使用的ip地址端口号。 比如在访问百度 https://www.baidu.com/的时候, …

Linux安装

安装方式介绍 Linux系统的安装方式,主要包含以下两种: 方式概述场景物理机安装直接将操作系统安装到服务器硬件上企业开发中,我们使用的服务器基本都是采用这种方式虚拟机安装通过虚拟机软件安装我们在学习阶段,没有自己服务器&a…

GraphQL

从表中查询10条数据 {user_info(_limit: 100) {idname} }根据id查询数据 {user_info(_where: {id: 1727515006802587648}_order_by: {create_time: _desc}_limit: 10) {idname} }外键联表查询(特别注意写法:update_by.id): {speaker_info(update_by.id: {_eq: 1729043650301…

修改MonkeyDev默认配置适配Xcode15

上一篇文章介绍了升级Xcode15后,适配MonkeyDev的一些操作,具体操作可以查看:Xcode 15 适配 MonkeyDev。 但是每次新建项目都要去修改那些配置,浪费时间和精力,这篇文章主要介绍如何修改MonkeyDev的默认配置,做到一次修改永久生效。 MonkeyDev的默认安装路径是在/opt/Mo…

STM32第九课:ADC单通道模数转换

一、ADC简介 ADC是Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。 STM32f103 系列有3个ADC,精度为12位&#xf…

vite项目修改node_modules

问题详情 在使用某个依赖的时候遇到了bug,提交issue后不想一直等待到作者更新版本,所以寻求临时自己解决 问题解决 在node_modules里找到需要修改的依赖,修改想要修改的代码 修改后记得保存 然后在node_modules里找到.vite文件夹&#x…

Java8 CompletableFuture异步编程-入门篇

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 前言 1、Future vs CompletableFuture 1.1 准备工作 1.2 Future 的局限性 …

01_Maven

文章目录 Maven安装MavenMaven的工作流程配置MavenMaven的使用module和project的关系如何用Maven导包 如何用Maven进行项目构建指令介绍clean指令compile指令package指令install指令 Maven的依赖管理如何导包scope作用域依赖传递依赖冲突 使用Maven开发项目Junit如何使用Junit …

xss.pwnfunction.com靶机 Warmups

通关要求弹出警告框alert(1337) 没有用户交互 不能使用外链接 在chrome中测试 Ma Spaghet! 通过分析代码我们可以看到它直接用innerHTML将接收的内容赋值 但是我们不能使用<script>标签因为&#xff1a;HTML 5 中指定不执行由 innerHTML 插入的 <script> 标签。 所…

字符串标记高亮脚本

源码 #!/bin/bash # usage: # echo hhh|mark str [font_color] [background_color] # font_color and background_color is optional, default is black&whiterp_str$1 f_color30 b_color47if [ "${f_color}a" "a" ]; thenf_color30 fiif [ "${…

985硕的4家大厂实习与校招经历专题分享(part1)

先简单介绍一下我的个人经历&#xff1a; 985硕士24届毕业生&#xff0c;实验室方向:CV深度学习 就业&#xff1a;工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 &#xff08;只看大厂…