JVM类加载/双亲委派模型

news/2024/5/8 7:02:19/文章来源:https://blog.csdn.net/qq_52592775/article/details/128360002

类加载是一个复杂的过程, 那么我们平时说的类加载到底是干啥的呢?

一. 类加载是干啥的

我们都知道Java程序在运行之前, 需要进行编译, 由 .java => .class文件(二进制字节码文件) , 而在运行的时候呢, Java进程(JVM), 就会读取对应的 .class文件, 并且解析他的内容, 在内存中构造出类对象并进行初始化. 

总的来说就是: 类 从 文件 加载到 内存里.

二. 类加载过程

对于一个类来说, 他的生命周期是这样的: 

其中前五步是固定的顺序, 并且也是类加载的过程, 其中之间的三步属于连接, 所以对于类加载来说主要分以下几个步骤:

1. 加载.

2. 连接

  1. 验证
  2. 准备
  3. 解析

3. 初始化

下面来看集具体的执行内容.

1. 加载

找到 .class文件, 读取文件内容, 并且按照 .class文件的格式来解析.

在这个阶段, Java虚拟机需要完成一下三个事情:

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

2. 验证

检查当前的 .class文件里的内容格式是否符合要求, 保证这些信息被当作代码后运行不会危害虚拟机自身的安全.

.class文件长啥样, 官方文档有明确描述. 如下图:

Chapter 4. The class File Format

3. 准备

给类里的静态变量分配内存空间.

假设这样一段代码:

static int a = 10;

准备阶段就是给 a 分配内训空间(四个字节), 同时他初始化的值是0, 而不是10.

4. 解析

初始化字符串常量, 把符号引用替换成直接引用. 也就是初始化常量的过程.

.class文件里就会包含字符串常量. (代码中也会有很多地方用到字符串常量)

比如代码里有一行:

String str = "hello world";

但是, 在类加载之前, "hello world" 这个字符串常量是没有分配内存空间 (得类加载完了之后, 才有内存空间), 没有内存空间, str 里也就无法保存字符串常量的真实地址, 只能先使用一个占位符, 标记一下, 这块是 "hello world" 这个常量的地址, 等到真正给他分配过内存之后, 然后就用这个真正的地址代替之前的占位符.

5. 初始化

针对类进行初始化, 初始化静态成员, 执行静态代码块, 并且加载父类.

三. 合适触发类加载呢?

使用一个类的时候就触发了.

  1. 创建了这个类的实例.
  2. 使用了类的静态方法/静态属性.
  3. 使用了类的子类, 加载子类会触发加载父类.

四. 双亲委派模型

类加载器

JVM加载类, 是由 类加载器(class loader) 这样的模块来负责的.

JVM自带了多个类加载器.

  1. Bootstrap Classloader  负责加载标准库中的类
  2. Extension Classloader  负责加载JVM扩展的库的类
  3. Application Classloader  负责加载自己项目里的自定义的类

这三个类加载器各自负责各自的那一部分.

什么是双亲委派模型?

描述上述类加载器相互配合的工作过程就是双亲委派模型.

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

如下图:

那么按照这个顺序加载的好处在哪呢?

好处在于: 如果一个程序猿正好写了一个类, 他的全限定类名和标准库中的类冲突了. (比如你自己写一个类叫做 java.lang.Thread) , 此时就可以保证类加载可以加载到标准库中的类, 防止代码加载出现问题.

  • 上述三个类加载器存在父子关系.
  • 进行类加载的时候, 输入的内容 全限定类名, 例如 java.lang.Thread.
  • 加载的时候, 从 Application Classloader 开始加载.
  • 如果到最后回到 Application Classloader 之后也没有找到类, 那么就会抛出一个 "类未找到" 的异常, 类加载就失败了.

然后我也很奇怪, 双亲委派模型, 怎么没有双亲啊, 这不是儿子,父亲,爷爷吗, 也没有父母怎么叫双亲啊, 这就是机翻害死人了.

 

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

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

相关文章

【JY】 ABAQUS子程序UEL的有限元原理与应用

不等待即关注【简述ABAQUS中UEL子程序】ABAQUS作为成熟的商用有限元软件,可为高级用户提供特定的分析需求。ABAQUS常见的二次开发子程序包括:UMAT、VUMAT、UGENS、UEL和VUEL等。其中UEL/VUEL分别适用于ABAQUS的Standard/Explicit求解器。只有清楚有限元分…

C语言重点解剖关键字要点速记

1.在windows中,双击的本质是运行该程序,就是将程序(.exe)加载到内存当中去。任何程序在被运行之前都必须加载到内存当中去。 2.所有的变量本质都是在内存的某个位置开辟的。变量不能定义在硬盘上,因为变量必须在程序运行的时候才能被开辟&am…

软件设计师——项目管理

文章目录Gantt图与Pert图风险管理配置管理沟通管理题目举例Gantt图与Pert图 甘特图能够清晰描述每个任务的开始 / 结束时间及各任务之间的并行性,也可以动态地反映项目的开发进展情况,但难以反映多个任务之间存在的逻辑关系;PERT 利用项目的…

微机原理与接口技术笔记(持续更新)

文章目录前言储存系统与技术材料高速储存器缓冲储存器(Cache)材料,局部性,访问方式Cache全相联映射Cache交换与一致性单核CPU一致性处理多核CPU的MESI协议主储存器(内存)主要技术指标容量带宽内存模组与内存…

【C++进阶】C++11新特性上篇(万字详解)

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

[附源码]计算机毕业设计Python餐馆点餐管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

244. 谜一样的牛——二分+树状数组

有 n 头奶牛,已知它们的身高为 1∼n 且各不相同,但不知道每头奶牛的具体身高。 现在这 n 头奶牛站成一列,已知第 i 头牛前面有 Ai 头牛比它低,求每头奶牛的身高。 输入格式 第 1 行:输入整数 n。 第 2…n 行&#x…

UOS SDN

​ 文章目录 一.安装相关软件包二.上传并解压opendaylight软件包三.创建拓扑四.下发流表五.启动HTTP-server服务六.截图测试启动 OpenDayLight 的 karaf 程序,并安装如下组件: feature:install odl-restconf feature:install odl-l2switch-switch-ui feature:install odl-…

python制作问题搜索解答器,从此学习无忧

前言 大家早好、午好、晚好吖 ❤ ~ 今天博主给大家带来一个问题搜索解答器!! 需要素材 以及一双慧手和一个灵活的脑子~ 效果展示 代码展示 导入模块 import requests import tkinter as tk from tkinter import ttk import webbrowserdef search(wor…

Python中的魔法方法

python中的魔法方法是一些可以让你对类添加“魔法”的特殊方法,它们经常是两个下划线包围来命名的 Python的魔法方法,也称为dunder(双下划线)方法。大多数的时候,我们将它们用于简单的事情,例如构造函数(init)、字符串表示(str, r…

基于Geehy APM32F4移植使用letter-shell命令行终端

1. letter-shell简介 letter shell是一个C语言编写的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式设备。 说得直白点他就是一个命令行交互软件,可以读取用户输入的命令,找到并执行命令对应的函数。 letter-shell的功能十分强…

XXL-Job分布式任务调度框架-- 集群HA的配置3

一 xxl-job集群概述 1.1 xxl-job集群HA的作用 为了避免单点故障,任务调度系统通常需要通过集群实现系统高可用 由于任务调度系统的特殊性,“调度”和“任务”两个模块需要均支持集群部署,由于职责不同,因此各自集群侧重点也有…

适合零基础人群学习的Python入门教程,快来学习吧

适合零基础人群学习的Python入门教程学什么?小编为大家准备的Python学习教程,课程主要讲解:Python核心编程、Linux基础、前端开发、Web开发、爬虫开发、人工智能等内容。 对于初学者想更轻松的学好Python开发,爬虫技术&#xff0c…

Go环境搭建与IDE开发工具配置

安装Go语言编译器 Go语言编译器》编译器将源代码编译为可执行程序》源代码程序员使用高级语言所书写的代码文件》高级语言c/c/go…》机器语言0和1构成,机器能直接识别》汇编语言比机器语言稍微可读一点点的指令集 编译器下载地址 根据系统下载对应的go编译器版本…

三分查找算法

目录 一 算法简介 详细介绍 两种基本方法 二 算法实践 1)实数三分 拓展:秦九韶算法计算多项式 方法1:直接模拟累加 方法二:根据秦九韶算法 1)模板三分法 题目描述 解法 2)三分求极值 题目描述 …

Python:遗传算法最优路径

Hello,大家好!读研前写过一篇遗传算法的代码,比较简单,算是个入门,当时就有想用它来解决最优路径的问题,上算法导论课时碰巧有听到同学有分享过,但由于自己研究的方向不是这块,就没有…

C# 绘图基本方法

一得到Graphics对象 1 OnPaint事件中使用 Protected overrid void OnPaint(PaintEventArgs e) {Graphics ge.Graphics;...... }2 其他情况实现 Graphics gthis.CreaateGraphics();二 关于Graphics的释放 1 对于CreateGraphics()得到的Graphics对象&a…

【Linux权限】文件权限值,权限掩码,粘滞位,普通用户添加信任名单

目录 1.权限分为2种用户:超级用户,普通用户 2.文件类型和访问权限 ​3.权限掩码(八进制) 4.sudo短暂提升权限 5.粘滞位 1.权限分为2种用户:超级用户,普通用户 超级用户(通常为root&#x…

ArcGIS Pro 加载项(5)——样式符号属性对调

之前是已经通过Python构建脚本工具,实现了stylx文件的符号属性的对调。 ArcGIS Pro脚本工具(12)——样式符号属性对调_学学GIS的博客-CSDN博客为地类做样式符号匹配经常碰到这样的问题:属性表里面只有地类代码,但是做…

安全分析模型

安全分析模型自动化调优 MLOps(Machine Learning Operations)是一种人工智能 的工程实践,是面向机器学习项目的研发运营管理体系 。旨在实现 ML 管道的操作、ML 模型的部署和管理标准化,支持ML 模型的发布、激活、监控、性能跟踪…