【JVM基础07】——类加载器-什么是类加载器?类加载器有哪些?双亲委派了解吗?

目录

  • 1- 引言:类加载器
    • 1-1 类加载器是什么?(What)
    • 1-2 为什么要用类加载器? 作用:类加载的过程?(Why)
  • 2- ⭐核心:类加载器详解(How)
    • 2-1 类加载器分类
    • 2-2 什么是双亲委派模型?
    • 2-3 为什么采用双亲委派机制?
  • 3- 小结:
    • 3-1 类加载器是什么?类加载器有哪些种类?
    • 3-2 什么是双亲委派模型?为什么采用双亲委派模型?


1- 引言:类加载器

1-1 类加载器是什么?(What)

  • 类加载器:JVM 只会运行二进制文件,类加载器的作用就是将字节码文件(.class文件)加载到JVM中,从而让 Java 程序能够启动起来。它读取二进制数据,并将这些数据转换成 java.lang.Class 类的实例。每个这样的实例用于表示 JVM 中的一个 Java 类。

image.png

1-2 为什么要用类加载器? 作用:类加载的过程?(Why)

1-加载(Loading):

  • 类加载器从各种来源(如文件系统、网络等)读取特定的类文件(.class文件),并为之创建一个java.lang.Class对象。在这个阶段,JVM会获取类的全名、类中的直接超类、是否为接口、方法、字段和常量池等基本信息。

2-验证(Verification):

  • 验证阶段确保加载的类符合JVM规范,并检查字节码文件是否未被篡改且安全无害。这一步骤包括确保格式正确,检查语义(例如,final的类没有子类),并确保字节码不包含非法数据。

3-准备(Preparation):

  • 在准备阶段,JVM为类变量分配内存,并设置默认初始值,这些变量使用的内存必须在方法区中进行分配。此阶段不包括Java代码赋予的具体值,而是系统设定的默认值(如null、0或false)。

4-解析(Resolution):

  • 解析是将类、接口、字段和方法的符号引用转换为直接引用的过程。这一步骤涉及到将在类的常量池内的符号引用替换为实际引用的具体过程。

5-初始化(Initialization):

  • 初始化是类加载过程的最后一个阶段,涉及执行类构造器<clinit>()方法的过程。此方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生。这一步是执行Java程序代码初始化类变量和静态代码块。

2- ⭐核心:类加载器详解(How)

2-1 类加载器分类

①启动类加载器/引导类加载器(BootStrap ClassLoader)

  • 该类加载器是使用 C++ 语言编写的,主要是用来加载 Java 核心库的。

②扩展类加载器(ExtClassLoader)

  • 实际上是加载扩展目录的,加载 jre/lib/ext 下的扩展目录的内容

③应用类加载器(AppClassLoader)

  • 应用类加载器,AppClassLoader 主要负责加载的是 CLASSPATH 下的所有类,是 Java 默认的类加载器,负责加载开发者自己编写的 Java 类。
  • 在 Java 的日常应用开发中,类似加载基本上都是由这三种互相配合来去完成加载的,各自加载各自的类即可。

④自定义类加载器(CustomerClassLoader)

  • 自定义类加载器,实现自定义加载功能在实际的日常开发中应用的不是很多。

image.png


2-2 什么是双亲委派模型?

  • 双亲委派模型:在Java虚拟机(JVM)加载类时,它采用了一种称为双亲委派模型的机制。具体来说,当JVM需要加载一个特定的类时,当前的类加载器会首先委托其父类加载器尝试加载这个类。这个过程会一直向上递归,即每个类加载器都会先委托其父类加载器,直到达到顶层的启动类加载器。如果父类加载器能成功加载该类,则使用父类加载器的定义;如果父类加载器无法加载该类(即不在其负责的路径下找到该类的字节码),那么子加载器会尝试自己加载这个类。这种模型的主要优势在于它能够确保Java核心库的类不被自定义的类所替代,从而增强了Java应用的安全性和类的一致性。

image.png


2-3 为什么采用双亲委派机制?

  • ① 通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保持一致性。
  • ② 为了安全,保证类库 API 不会被修改。

举例:

package java.lang;public class String {public static void main(String[] args) {System.out.println("demo info");}
}
  • 执行上述代码的 main 函数,会出现异常,在类 java.lang.String 中找不到 main 方法

image.png
原因:由于是双亲委派的机制,java.lang.String 的在启动类加载器得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有 main 方法。这样就能防止恶意篡改核心 API 库。


3- 小结:

3-1 类加载器是什么?类加载器有哪些种类?

在这里插入图片描述


3-2 什么是双亲委派模型?为什么采用双亲委派模型?

在这里插入图片描述


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

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

相关文章

Pytorch基础:Tensor的squeeze和unsqueeze方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;squeeze和unsqueeze是Tensor的一个重要方法&#xff0c;同时它们也是torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.…

【SpringBoot】1 Gitee

本项目 Gitee 地址&#xff1a;https://gitee.com/Lin_DH/system idea中可能装个gitee的插件&#xff0c;这样操作起来比较方便。 1&#xff09;登录 Gitee 官网&#xff08;https://gitee.com/&#xff09;&#xff0c;新建仓库。 2&#xff09;复制新建的 Gitee 仓库地址&am…

Unity3D之TextMeshPro使用

文章目录 1. TextMeshPro简介2. TextMeshPro创建3. TextMeshPro脚本中调用4. TextMeshPro字体设置及中文支持过程中出现的一些问题 1. TextMeshPro简介 【官网文档】https://docs.unity.cn/cn/2020.3/Manual/com.unity.textmeshpro.html TextMeshPro 是 Unity 的最终文本解决…

软件测试---Linux

Linux命令使用&#xff1a;为了将来工作中与服务器设备进行交互而准备的技能&#xff08;远程连接/命令的使用&#xff09;数据库的使用&#xff1a;MySQL&#xff0c;除了查询动作需要重点掌握以外&#xff0c;其他操作了解即可什么是虚拟机 通过虚拟化技术&#xff0c;在电脑…

Leetcode49. 字母异位词分组(java实现)

今天我来给大家分享的是leetcode49的解题思路&#xff0c;题目描述如下 如果没有做过leetcode242题目的同学&#xff0c;可以先把它做了&#xff0c;会更好理解异位词的概念。 本道题的大题思路是&#xff1a; 首先遍历strs&#xff0c;然后统计每一个数组元素出现的次数&#…

电商数据精细化运营解决方案(18页PPT)

方案介绍&#xff1a; 电商数据精细化运营解决方案通过全面、深入的数据分析与应用&#xff0c;助力电商企业实现精细化管理和精准化营销&#xff0c;从而在激烈的市场竞争中脱颖而出。 部分方案内容&#xff1a;

Prometheus 监控Tomcat等java应用的状态

5月应用服务出现问题&#xff0c;当别的小伙伴问我&#xff0c;有没有Tomcat等应用状态的监控的时候&#xff0c;我有点儿尴尬。所以赶紧抽空部署一下。 在配置之前&#xff0c;就当已经会安装jdk和tomcat了。 一、下载jmx_exporter #linux下 cd /usr/local/prometheus wget …

Debug-018-elementUI-el-tree中通过CSS隐藏任意一项的选择框checkbox

前情提要&#xff1a; 我们项目中使用的是elementUI&#xff0c;业务中经常需要使用到el-tree组件去实现一些有层级关系的功能。现在有一个需求描述一下&#xff1a;首先是这个el-tree是个有checkbox的树&#xff0c;每一子节点都可以被选择&#xff0c;用于去实现一些系统的权…

PHP多场地预定小程序系统源码

一键畅游多地&#xff01;多场地预定小程序的超实用指南 段落一&#xff1a;【开篇&#xff1a;告别繁琐&#xff0c;预订新体验】 &#x1f389;&#x1f680; 还在为多个活动或会议的场地预订而头疼不已吗&#xff1f;多场地预定小程序来拯救你啦&#xff01;它像是一位贴心…

【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)

Qt 窗口是通过 QMainWindow类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;Menu Bar&#xff09;、多个工具栏&#xff08;Tool Bars&#xff09;、…

7.26总结

1.我发现我的界面非常不符合要求&#xff0c;魔改了一下界面 2.在此基础上实现了编辑资料的功能&#xff0c;之前的编辑资料不够用完善&#xff0c;现在将所有数据存入数据库&#xff0c; 然后将更改的图片路径存到了服务端的文件夹&#xff0c;文件名为id更方便获取图片&…

Cuda编程模型中常见的错误检测方法

Cuda编程模型中常见的错误检测方法 1 CUDA错误检测简介2 直接嵌入检测函数2.1 检测函数介绍2.2 使用示例 3 封装在.cuh头文件中嵌入3.1 创建 error.cuh 头文件3.2 在 CUDA 程序中包含 error.cuh 并调用 CHECK 宏3.3 使用示例 1 CUDA错误检测简介 CUDA编程模型中的错误检测是确…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组&#xff0c;存储指定长度的字符序列&#xff0c;数组中的每个元素都是一个char类型的变量&#xff0c;如&#xff1a; char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

【二叉树 C++DFS】2458. 移除子树后的二叉树高度

本文涉及知识点 二叉树 CDFS LeetCode 2458. 移除子树后的二叉树高度 给你一棵 二叉树 的根节点 root &#xff0c;树中有 n 个节点。每个节点都可以被分配一个从 1 到 n 且互不相同的值。另给你一个长度为 m 的数组 queries 。 你必须在树上执行 m 个 独立 的查询&#xff…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别&#xff1a;Hash为默认模式&#xff0c;url中包含一个#符号的哈希部分。优势&#xff1a;兼容性好&#xff0c;不需要后端服务器的特殊配置。缺点&#xff1a;不够美观&#xff0c;搜索引擎优化较差。History模式使用的浏览器的His…

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

STM32-寄存器时钟配置指南

目录 启动 SystemInit SetSysClock 总结 启动 从startup_stm32f0xx.s内的开头的Description可以看到 ;* Description : STM32F051 devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the in…

微信小程序支付流程

前端需要做的事情&#xff1a; 生成平台订单&#xff1a;前端调用接口&#xff0c;向后端传递购买的商品信息、收货人信息&#xff0c;&#xff08;后端生成平台订单&#xff0c;返回订单编号&#xff09;获取预付单信息&#xff1a;将订单编号发送给后端后&#xff0c;&#x…

Hadoop单机版环境搭建

一 . 案例信息 Hadoop 的安装部署的模式一共有三种&#xff1a; 本地模式&#xff0c;默认的模式&#xff0c;无需运行任何守护进程&#xff08; daemon &#xff09;&#xff0c;所有程序都在单个 JVM 上执行。由 于在本机模式下测试和调试 MapReduce 程序较为方便&#x…

leetocde662. 二叉树最大宽度,面试必刷题,思路清晰,分点解析,附代码详解带你完全弄懂

leetocde662. 二叉树最大宽度 做此题之前可以先做一下二叉树的层序遍历。具体题目如下&#xff1a; leetcode102二叉树的层序遍历 我也写过题解&#xff0c;可以先看看学习一下&#xff0c;如果会做层序遍历了&#xff0c;那么这题相对来说会简单很多。 具体题目 给你一棵…