类加载机制。

article/2025/9/26 15:24:13

文章目录

  • 一、类加载机制:
  • 二、类加载器:
  • 三、双亲委派机制:


一、类加载机制:

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
在这里插入图片描述类加载过程

接下来详细介绍类加载的几个重要阶段:加载、验证、准备、解析和初始化

3.1、加载

在加载阶段,虚拟机主要执行以下三个操作

1)、通过类的全限定名来获取定义这个类的二进制字节流。

2)、将这个字节流所代表的静态存储结构转化成方法区的运行时数据结构。

3)、在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。

这个阶段相比其他阶段来说,是开发人员可控性最强的阶段。因为这个阶段既能使用系统提供的加载器(这个加载器后面会进行介绍)加载,又能通过开发人员自定义的加载器进行加载。

在加载这个阶段还有一个需要注意的地方,在执行第一个操作时,需要知道可以从哪里获取class文件,例如:

1)、从压缩文件中读取(JAR,WAR等)

2)、从本地磁盘中获取

3)、从网络上获取(Applet)

4)、运行过程中动态生成(动态代理)

5)、其他文件生成(jsp生成对应的class文件)

6)、从数据库中读取

3.2、验证

验证阶段主要有4个阶段的验证:文件格式验证、元数据验证、字节码验证和符号验证

3.2.1、文件格式验证

这一阶段要验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理,主要包括魔数、版本号、常量池等验证。

3.2.2、元数据验证

这个阶段是对字节码描述的信息进行语义分析,以保证其描述的信息符合java语言规范的要求。主要包括是否有父类,类中的字段、方法是否与父类冲突,如果不是抽象类,是否实现了其父类或接口中要求实现的所有方法等;

3.2.3、字节码验证

这个阶段是在元数据验证之后,对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害虚拟机的安全事件,主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。也是验证过程最复杂的一个阶段。

3.2.4、符号引用验证

这个阶段的校验发生在虚拟机将符号引用转化为直接引用的时候。是对类自身以外的信息进行匹配性校验。主要目的是确保解析动作能正常执行。

3.3、准备

准备阶段是为类变量分配内存并设置类变量初始值的阶段,分配这些内存是在方法区里面进行的,这个阶段有两点需要重点介绍以下的:

1)、只有类变量(被static修饰的变量)会分配内存,不包括实例变量,实例变量是在对象实例化的时候在堆中分配内存的。

2)、设置类变量的初始值是数量类型对应的默认值,而不是代码中设置的默认值。例如public static int number=111,这类变量number在准备阶段之后的初始值是0而不是111。而给number赋值为111是在初始化阶段。

3.4、解析

解析阶段是虚拟机将常量池里内的符号引用转换为直接引用。这里注意2个概念:

1)、符号引用:以一组符号来描述所有引用的目标,符号可以是任何形式的字面量,只要使用时能正确定义到目标即可。

2)、直接引用:可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符等7类符号引用进行的。

3.5、初始化

这个阶段是类加载过程的最后一步,是代码真正开始执行的时候,在这个阶段,开发人员可以根据自己的需求去给类变量初始化赋值。简单来说就是执行类构造器()方法的过程。

二、类加载器:

系统提供的3种类加载器

1)、启动类加载器(Bootstrap ClassLoader):负责将存放在<JAVA_HOME>\lib目录中,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。(注:仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)

2)、扩展类加载器(Extension ClassLoader):负责加载<JAVA_HOME>\lib\ext目录中的,或被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

3)、应用程序类加载器(Application ClassLoader):负责加载用户路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,一般情况下该类加载是程序中默认的类加载器。

三、双亲委派机制:

双亲委派机制,是按照加载器的层级关系,逐层进行委派。
在这里插入图片描述要加载一个类MyClass.class,从低层级到高层级一级一级委派,先由应用层加载器委派给扩展类加载器,再由扩展类委派给启动类加载器;启动类加载器载入失败,再由扩展类加载器载入,扩展类加载器载入失败,最后由应用类加载器载入,如果应用类加载器也找不到那就报ClassNotFound异常了。

双亲委派机制的优点:

1.保证安全性,层级关系代表优先级,也就是所有类的加载,优先给启动类加载器,这样就保证了核心类库类。

2.避免重复,如果父类加载器加载过了,子类加载器就没有必要再去加载了。


http://chatgpt.dhexx.cn/article/tTBVBiRB.shtml

相关文章

什么是类加载?

类加载 什么是类加载机制&#xff1f; 类加载机制是指虚拟机把描述类的数据从class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是拟虚拟机的类加载机制。 如何区分一个文件的文件的类…

(一) 类加载过程详解 (类加载机制 第一篇)

当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到 JVM。 package com.shendu;public class JvmTest01 {public static final int initData 666; public int compute() { int a 1;int b 2;int c (a b) * 10;return c;}public…

JVM(三):类加载机制(类加载过程和类加载器)

一、为什么要使用类加载器&#xff1f; Java语言里&#xff0c;类加载都是在程序运行期间完成的&#xff0c;这种策略虽然会令类加载时稍微增加一些性能开销&#xff0c;但是会给java应用程序提供高度的灵活性。例如&#xff1a; 1.编写一个面向接口的应用程序&#xff0c;可能…

类加载机制(类加载过程和类加载器)

一、为什么要使用类加载器&#xff1f; Java语言里&#xff0c;类加载都是在程序运行期间完成的&#xff0c;这种策略虽然会令类加载时稍微增加一些性能开销&#xff0c;但是会给java应用程序提供高度的灵活性。例如&#xff1a; 1.编写一个面向接口的应用程序&#xff0c;可能…

类加载的过程是怎样的?

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 JVM加载java类就是将字…

类加载(基本说明、流程图、类加载各个阶段完成的任务)

目录 基本说明 类加载过程流程图 类加载各阶段完成的任务 加载阶段 ​编辑 连接阶段-验证 连接阶段-准备 连接阶段-解析 Initialization&#xff08;初始化) 类加载就是当字节码文件有了过后&#xff0c;进行下一步工作&#xff0c;不管是创建对象&#xff0c;还是干其…

什么是类的加载

一、什么是类的加载 java文件通过编译器变成了.class文件&#xff0c;接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。 其实&#xff0c;类加载器并不需要等到某个类被“首次主动使用”时再加载它&#xff0c;JVM规范允许类加载器在预料…

Windows下cmd命令—systeminfo

该命令是Windows中用于显示关于计算机及其操作系统的详细配置信息&#xff0c;包括操作系统配置、安全信息、产品 ID 和硬件属性&#xff0c;如 RAM、磁盘空间和网卡和补丁信息等。 例如&#xff1a;查看自己的计算机是32位还是64位 可以通过如下步骤&#xff1a; ①首先&…

SysInfoTools MS SQL Transaction Log Recovery 22.0

SysInfo DBF 修复工具专门用于修复由 dBase II IV、V Visual FoxPro、Clipper、dBXL、dBFast、CodeBase、MultiBase、Arago 生成的损坏、损坏和无法访问的 DBF 文件。从 SysInfoTools 下载最新和更复杂的基于 Windows 的应用程序 DBF 恢复实用程序&#xff0c;它可以一次性完美…

MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

SysInfo主要是通过WMI来获取系统信息的&#xff0c;但是WMI获取的操作系统信息中没有Windows操作系统是32位还是64位的内容&#xff0c;所以需要另外想办法编程获取&#xff0c;比较常见的方法是调用Windows API函数GetNativeSystemInfo()或IsWow64Process()。之前分别用MASM32…

系统信息:uname,sysinfo,gethostname,sysconf

且欲近寻彭泽宰&#xff0c;陶然共醉菊花怀。 文章目录 系统信息系统标识 unamesysinfo 函数gethostname 函数sysconf()函数 系统信息 系统标识 uname 系统调用 uname()用于获取有关当前操作系统内核的名称和信息&#xff0c;函数原型如下所示&#xff08;可通过"man 2 …

Django-搭建sysinfo获取系统信息

文章目录 前言一、项目搭建二、主机信息监控三、Celery定时任务和异步任务 前言 使用Django&#xff0c;搭建sysinfo&#xff0c;Linux中,sysinfo是用来获取系统相关信息的结构体 本篇基于&#xff1a;https://github.com/hypersport/sysinfo#readme项目借鉴路径: https://gi…

SysInfo(电脑系统信息)0.0.0.1beta2

文件说明符 : D:\masm32\wmi\sysInfo\sysInfo0.0.0.1beta2.exe 属性 : A--- 数字签名:否 PE文件:是 语言 : 中文(简体&#xff0c;中国) 文件版本 : 0.0.0001 beta2 说明 : 电脑系统信息 版权 : PurpleEndurer 产品版本 : 0.0.0001 beta2 产品名称 : 电脑系统信息 公司名称 : P…

sysinfo函数、结构体使用

1&#xff0c;头文件&#xff1a; #include <sys/sysinfo.h>2&#xff0c;函数声明&#xff1a; int sysinfo(struct sysinfo *info);3&#xff0c;返回值&#xff1a; 成功返回0&#xff0c;错误返回-1&#xff1b; 4&#xff0c;sysinfo结构体名称 Linux 2.3.23(i38…

Linux中sysinfo的用法

sysinfo结构体 Linux中,可以用sysinfo来获取系统相关信息。 Linux中,sysinfo是用来获取系统相关信息的结构体。 函数声明和原型&#xff1a; #include <sys/sysinfo.h> int sysinfo(struct sysinfo *info); 在Linux中不同对版本结构体不一样 在Linux 2.3.16中&#…

sysinfo 函数

在linux系统中&#xff0c;我们可以使用sysinfo()获取一些系统统计信息。我们在终端命令行中输入“man 2 sysinfo”即可获取sysinfo()的详细信息&#xff0c;如下图所示。 从上图可以知道&#xff0c;使用uname需要包含头文件"#include <sys/sysinfo.h>" sysi…

natapp

简介 natapp是一个内网穿透工具&#xff0c;内网穿透也叫做内网映射&#xff0c;也叫“NAT穿透”&#xff0c;所谓内网穿透简单来说就是让外网能够访问内网&#xff0c;即把自己的电脑当服务器&#xff0c;让别人能够访问自己的电脑。 使用 1、注册一个账号&#xff0c;并且进…

WAP PUSH

PUSH &#xff08;WAP-PUSH&#xff09;又叫做服务信息或推入信息&#xff0c;是一种特殊格式的短信。 目录 基本简介 特点优势 系统框架 推送协议 推送服务方式 短消息网关简介 基于短信网关发送WAP PUSH wapPDU 模式 分析 良好前景 基本简介 特点优势 系统框架 推送协议 推送…

睡眠 应该用 a加权 c加权_时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用...

本应用实践平台为BigQuant人工智能量化平台 为什么要引入TWAP和 VWAP&#xff1f; 为了评估策略的资金容量&#xff0c;我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展&#xff0c;支持了策略能够按更丰富的算法交易价格&#xff08;WAP&#xff09;进行撮合。…

【Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议)】

Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议) 需要IOS开发提供的信息 1.推送证书,.p8格式的文件 2.bundleId 3.keyId 4.teamId MAVEN依赖 <dependency><groupId>com.eatthepath</groupId><artifactId>pushy</artifactId>…