来聊聊JVM中的类加载过程以及双亲委派模型(学习Java必知内容)

文章目录

  • 1. 类加载过程
    • 加载
    • 验证
    • 准备
    • 解析
    • 初始化
  • 2. 双亲委派模型
    • 一个类的加载流程
    • 双亲委派模型的优点
  • 总结


1. 类加载过程

在整个 JVM 执行过程中, 和我们程序员关系最密切的就是类加载的过程, 所以接下来我们来看下类加载的执行流程.

对于一个类来说, 它的生命周期是这样的:
在这里插入图片描述

其中前 5 步是固定的顺序并且也是类加载的过程, 其中中间的 3 步我们都属于连接, 所以对于类加载来说总共分为以下几个步骤:

  1. 加载
  2. 验证
  3. 准备
  4. 解析
  5. 初始化

类加载, 是一个非常复杂的过程, 此处我们只是简单介绍一下类加载的大致流程. 细致解析需到 Java 官方文档进行查阅. 下面我们来看看每个步骤的具体执行内容.

加载

“加载”(Loading)阶段指的是整个“类加载”(Class Loading)过程中的一个阶段,在加载 Loading 阶段,Java虚拟机需要完成以下三件事情:

  1. 通过一个类的全限定名来获取定义此类的二进制字节流。
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

通俗来说, 就是找到 .class 文件, 打开文件, 读取文件内容, 并尝试解析里面的格式.

验证

验证这一阶段的目的是, 确保 .class 文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

验证选项:

  • 文件格式验证
  • 字节码验证
  • 符号引用验证

准备

准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。最终的目标是构造出完整的类对象。

比如此时有这样一行代码:

public static int value = 123;

它在这个阶段 value 的 int 值是赋为 0,而非 123。

解析

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。

主要是初始化类中涉及到的一些字符串常量。

初始化

初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。

也就是这个环节,开始对类对象进行更具体的初始化操作。比如初始化静态成员,执行静态代码块,加载父类等等。

2. 双亲委派模型

谈到类加载机制, 不得不提的一个概念就是 “双亲委派模型”.

双亲委派模型, 可以理解为就是类加载中 JVM 如何去找 .class 文件的一个过程.

JVM 加载 .class 文件时, 会使用到 “类加载器” 模块, JVM 中自带了三个类加载器.

在这里插入图片描述

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

一个类的加载流程

在这里插入图片描述

  1. 首先, 会从 Application ClassLoader 开始. 但不会立即就搜索第三方库的目录, 而是先把加载任务委派给父类, 让父类先尝试加载.
  2. 到了 Extension ClassLoader, 也不会立即就搜索扩展库的目录, 也会把加载任务委派给父类, 也让父类尝试加载.
  3. 到了 Bootstrap ClassLoader, 也想着把任务委派出去, 可是 Bootstrap ClassLoader 已经没有父类了, 只能自己动手搜索类了. 如果找到了这个类, 就会进行后续的加载. 如果没找到这个类, 就会将这个任务交回给子类加载器去完成.
  4. 任务回到了 Extension ClassLoader, 此时收到父类交回的任务后, 就会开始搜索扩展库的目录, 看看有没有匹配的 .class 文件. 如果找到了这个类, 就会进行后续的加载. 如果没找到这个类, 就会将这个任务交回给子类加载器去完成.
  5. 任务回到 Application ClassLoader, 此时就会开始搜索第三方库的目录(往往是自己开发时的项目目录), 如果找到了这个类, 就会进行后续的加载. 如果没找到这个类, 这时就会抛出异常.

双亲委派模型的优点

  1. 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了。
  2. 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户自己提供的因此安全性就不能得到保证了。

总结

✨ 本文主要讲解了 JVM 中的类加载过程, 以及其中涉及到的双亲委派模型, 是我们学习 Java 过程中, 需要着重了解的.
✨ 想了解更多知识, 请持续关注博主, 本人会不断更新学习记录, 跟随我一起不断学习.
✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.

再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

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

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

相关文章

canal本地安装和使用

1、组件版本 canal.deployer-1.1.7 kafka_2.13-2.6.0 jdk8 apache-zookeeper-3.6.0-bin mysql5.7 2、解压canal.deployer-1.1.7 2.1、修改canal.properties配置文件 ##改为kafka canal.serverModekafka## 改为instance canal.destinations instance## 改为true&#x…

SiP封装、合封芯片和芯片合封是一种技术吗?都是合封芯片技术?

合封芯片、芯片合封和SiP系统级封装经常被提及的概念。但它们是三种不同的技术,还是同一种技术的不同称呼?本文将帮助我们更好地理解它们的差异。 一、合封芯片与SiP系统级封装的定义 首先合封芯片和芯片合封都是一个意思 合封芯片是一种将多个芯片&a…

ElementPlusError: [ElOnlyChild] no valid child node found

突然发现页面报了一堆黄色的错误提示 查了下原来是这里导致的,只需要把v-if 挪到popover那层即可 解决

在有springSecurity或者若依项目中获取当前系统登录的用户信息

方法一(springSecurity自带的) AuthenticationPrincipal 是 Spring Security 框架中的一个注解,用于获取当前已认证用户的 principal(即用户身份信息)。 方法二(若依项目自带的) (1…

政务大数据与资源平台建设解决方案:PPT全文75页,附下载

关键词:智慧政务解决方案,大数据解决方案,数据中心解决方案,数据治理解决方案 一、政务大数据与资源平台建设背景 1、政务大数据已成为智慧城市建设的必要基础 为响应国家不断加快5G基建、大数据、人工智能等新型基础设施建设布…

基于Python实现汽车销售数据可视化+预测【500010086.1】

导入模块 import numpy as np import pandas as pd from pylab import mpl import plotly.express as px import matplotlib.pyplot as plt import seaborn as sns设置全局字体 plt.rcParams[font.sans-serif][kaiti]获取数据 total_sales_df pd.read_excel(r"./data/中…

IT支持团队的绩效指标和最佳实践

一名员工在远程时因笔记本问题寻求IT支持,尽管他们多次尝试排除故障,但由于缺乏专业知识,最终还是无法访问工作所需的应用程序。这时,他们需要一名专业的 IT 技术人员来指导他们,但他们只能等待有人注意到并回应他们的…

解决Activiti5.22流程图部署在Windows上正常,但在linux上部署后出现中文变方块的问题

总结/朱季谦 楼主最近在做公司的工作流平台,发现一个很无语的事情,Activiti5.22的流程图在Windows环境上部署,是可以正常查看的,但发布到公司的Linux服务器上后,在上面进行流程图在线部署时,发现中文都变成…

PC弹框点击确认,数据新增成功,关闭弹框

<el-dialog width"500px" :visible.sync"showDialog" title"新增角色"><el-form-item><el-row type"flex" justify"center"><el-col :span"12"><el-button size"mini" type…

ubuntu22.04安装wvp-gb28181-pro 2023-11-23最新版本(一键安装)

下载程序 输入下面命令&#xff0c;输入普通用户密码&#xff0c;切换到 root用户 sudo su git clone -b ubuntu_wvp_online_install_2023_0425 https://gitcode.net/zenglg/ubuntu_wvp_online_install.git 等待下载完成 安装 进入到克隆下来的路径中 cd /home/tuners/ub…

sam和mobilesam的c#调用dll

这个主要注意&#xff1a; 我原本从一个地方把这个工程拷贝到另一个地方&#xff0c;然后我看了解决方案下的依赖项是有感叹号的&#xff0c;且这个时候代码出现很多下划的波浪红线。 然后我的做法如下&#xff1a; 然后我发现一直添加不了opencvsharp的dll文件&#xff0c;报…

鸿蒙开发环境搭建-deveco-studio 开发工具安装问题()

从华为官网下载工具deveco-studio, 下载地址 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 这是下载后的工具 1、一步步安装步骤 报错了&#xff0c;一般安装都会报这个错误 看似问题不小&#xff0c;其实&#xff0c; 继续下步&#xff0c;就正常了&#xff0c…