JVM类加载

news2024/12/22 17:12:07

作用:负责从硬盘/网络中加载字节码信息,加载到内存中(运行时数据区的方法区中)

类加载过程

加载

使用IO读取字节码文件,转换并存储

为每个类创建一个Class类的对象

存储在方法区中

链接(验证,准备,解析)

验证:对字节码文件格式进行验证,文件是否被污染

对基本的语法格式进行验证

准备:为静态的变量进行内存分配

public static int value = 123;
value 在准备阶段后的初始值是 0,而不是 123.

静态变量在编译期间就初始化

解析:将符号引用转为直接引用

将字节码中的表现形式转为内存中表现(内存地址)

初始化

类的初始化,为类中的定义的静态变量进行赋值

public static int value = 123;value 在准备阶段后的初始值是 0,而不是 123.

类什么时候会被加载(初始化)

1.在类中运行main方法

2.通过new关键字创建对象

3.使用类中的静态变量,静态方法,静态代码块

4.反射 Class.forName(“类的地址”)

5.子类被加载

以上都是主动使用;下面两种情况为被动,且不会导致类的加载。

(1)应用该类的静态常量(final修饰,编译期间就已经赋值的)

(2)应用该类时,将类当做数组的元素类型,即构造这个类的数组

类加载器分类

具体的负责加载类的一些代码

1.引导类加载器,用c/c++语言开发的,jvm底层的开发语言,负责加载java核心类库。

与java语言无关

2.扩展类加载器:用Java语言编写的,由sun.misc.Launcher$ExtClassLoader 实现,继承自java.long.ClassLoader类,加载api中的类

3.应用程序类加载器:Java 语言编写的,由sun.misc.Launcher$AppClassLoader 实现. 派生于 ClassLoader 类.加载程序中自己开发的类。

4.自定义类加载器

双亲委派机制:

双亲委派模式要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,请注意双亲委派模式中的父子关系并非通常所说的类继承关系,而是采用组合关系来复用父类加载器的相关代码,类加载器间的关系如下:

加载一个类时,先委托给父类加载器加载,如果父加载器没有找到,继续向上级委托,直到引导类加载器,父级找到就返回,父级如果没有找到,就委派给子级加载器。最终没有找到,就报ClassNotFoundException异常。为了先确保加载系统类

(即每个儿子都很懒,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己想办法去完成,这不就是传说中的实力坑爹啊?)

打破双亲委派机制

通过继承ClassLoad类,重写ClassLoad类中的loadclass方法(不推荐)重写findClass方法,实现自定义的类加载

典型的tomcat中,加载部署在tomcat中的项目时,就是用的是自己的类加载器。

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

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

相关文章

Jackson注解使用分析

文章目录Jackson常用注解1. 常用注解汇总2. 注解使用分析JsonIncludeJsonAnyGetterJsonAnySetterJsonNamingJsonAutoDetectJacksonInjectJsonAliasJsonValueJsonMergeJsonRawValueJsonEnumDefaultValueJsonFilterJsonSerializeJsonDeserializeJacksonAnnotationJacksonAnnotati…

excel合并技巧:查找函数遇到合并单元格怎么应对

大家都在期盼奖金的到来,可是核算奖金的同事正在苦恼,因为以前用得好好的VLOOKUP函数突然不合适了,很多人的奖金计算出来都变成了乱码:使用VLOOKUP函数每个部门只有第一行正确,其他都是乱码。看到这个表,相…

【服务器数据恢复】raid5硬盘离线后热备盘未启用的数据恢复案例

服务器数据恢复环境: 某品牌X3850服务器,组建的raid5磁盘阵列,该raid5磁盘阵列包含4块成员盘和1块热备盘。 服务器故障: 服务器在运行过程中由于未知原因突然崩溃,用户方工程师检查后发现该故障服务器raid5阵列中2块磁…

Electron + Vue 开发环境搭建

1.安装nodejs,下载网址:https://nodejs.org/en/ 点击安装程序,一路next即可 安装完成之后打开cmd测试,输入node -v查看node版本,输入npm -v查看npm版本 安装完成后,.msi格式的安装包已经将node.exe添加到…

Excel连接openGauss数据库实操

目录 前言 一、通过excel 添加数据源访问openGauss 1、查看Excel版本 2、下载 ODBC驱动 3、安装ODBC驱动 4、添加ODBC数据源 5、在excel中添加数据源(访问openGauss) 二、通过excel 的VBA(宏)访问openGauss 1、宏权限设置…

2.1 java基础 day02 流程控制 创建类和对象 栈堆元空间

1流程控制 流程控制: 1.1.计算机在执行代码时对指令代码执行顺序的控制 1.2.Java 流程控制主要分三种: 顺序执行 分支执行 重复执行 1.3.顺序执行 按代码和语法出现的先后顺序执行 1.4.分支执行 根据判断条件执行分支逻辑 可选分支、必选分支&#…

活体识别6:小视科技开源的静默活体检测

说明 该项目为小视科技的静默活体检测项目。开源地址在 https://github.com/minivision-ai/Silent-Face-Anti-Spoofing。 由于不是论文衍生项目,所以只有一个公众号文章的介绍:https://mp.weixin.qq.com/s/IoWxF5cbi32Gya1O25DhRQ 方案详情 该方案是…

【安全】端口复用:远程遥控iptablesSSLH工具

目录 基础知识点 链的概念 表的概念 表链关系 远程遥控iptables进行端口复用 Ⅰ、利用ICMP做遥控开关 ①创建端口复用链 ②创建端口复用规则,将流量转发至 22 端口 ③开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到…

使用Oracle VM VirtualBox安装Centos

1.下载安装Oracle VM VirtualBox 2.下载Centos 下载地址 旧版本 3.新建 选择镜像填写账户信息之后,我这边不知道什么原因,并不能完成所有工作,所以我一般不选择 4.选择镜像 5.安装 通过方向键和回车键选择 6.设置 选择中文 等待一些自动…

2023年“华数杯”国际大学生数学建模B题完整思路

2023华数杯如期开赛,本次比赛作为美赛的模拟赛,赛题和比赛时间都和美赛高度相似,因此大家 完全可以当作一次美赛之前的练习赛进行。美赛的发题时间与华数杯一致,都是早晨六点,现已经将机器翻译的初步翻译 结果进行了分…

c语言通讯录max——数据的持久化处理(详解)

用文件操作升级通讯录前言1.实现逻辑2.用哪种文件存储数据2. save_contact函数设计3. load_contact 函数设计5.代码总览contact.hcontact.ctext.c前言 在有关通讯录的上一篇博客中,作者用柔性数组实现了动态改变通讯录占用空间的功能,但是在最后还是留下…

【Go基础】Http编程

文章目录1. http协议1.1 请求方法1.2 URL1.3 协议版本1.4 请求头1.5 请求正文1.6 http response1.7 https2. go语言http标准库3. http router4. 请求校验5. http中间件6. GIN6.1 路由6.2 参数获取6.3 利用postman提交http请求6.4 生成response6.5 参数检验6.6 中间件6.7 会话7.…

互联网分层模型

互联网的逻辑实现被分为好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。用户接触到的只是最上面的那一层,根本不会感觉到下面的几层。要理解互联网就需要自下而上理解每一层的实现的功能。如上图所示,互联网…

55.Isaac教程--Livox 激光雷达

Livox 激光雷达 ISAAC教程合集地址文章目录Livox 激光雷达支持的硬件和固件在桌面上设置和运行示例应用程序在机器人上设置和运行示例应用程序查看正在运行的应用程序将来Livox 激光雷达 Isaac SDK 支持使用 Livox LIDAR,包括兼容的驱动程序和示例应用程序。 支持的…

Android马甲包的那些事儿

制作Android马甲包最简单的方式就是使用 productFlavors 机制。本文就是在productFlavors机制的基础上制作的马甲包,每个马甲只需要在build.gradle文件中配置一下包名、各种key、签名文件配置启动页、logo、app名等资源配置服务器域名、微信分享回调Activity等代码此…

Windows上tensorflow的GPU死活引用不了(tensorflow 2.11无法调用GPU)

tensorflow对于gpu的支持只到2.10,如果你装了最新的tf(2.11),需要先卸载2.11。 安装代码: pip install tensorflow2.10 -i https://pypi.tuna.tsinghua.edu.cn/simple/解决过程: 查看CUDA与cuDNN配套版本: https:/…

解决ModuleNotFoundError: No module named ‘pygame‘问题

一、问题描述在开发环境运行Python的源码游戏时,游戏不能正常运行,且提示(ModuleNotFoundError: No module named pygame【没有发现模块错误:没有发现名为pygame的模块】)如下图所示:二、问题分析通过查看提…

OpenCV实战——基于均值漂移算法检测图像内容

OpenCV实战——基于均值漂移算法检测图像内容0. 前言1. 均值漂移算法2. 检测图像内容3. 完整代码相关链接0. 前言 直方图反投影的结果是一个概率图,表示在特定图像位置找到给定图像内容的概率。假设我们现在知道一个物体在图像中的大概位置;概率图可用于…

在 Navicat Monitor for MySQL/MariaDB 中配置实例

Navicat Monitor for MySQL/MariaDB 是一个无代理的远程服务器监控工具,它包含的功能可以使监控数据库(DB)实例发挥最大效用和更轻松。此外,基于服务器的架构使其可以通过网页浏览器从任何地方访问,从而为你提供无障碍…

DaVinci 项目设置:图像缩放调整

项目设置/图像缩放调整Project Settings/Image Scaling图像缩放调整 Image Scaling选项卡可用于设置片段在输入、输出时的缩放及相应的插值算法。图像缩放调整Image Scaling主要用于选择缩放处理的插值方法,也可用于载入输入、输出缩放调整的预设。缩放过滤器Resize…