浅谈 JVM 类加载过程

🚗🚗🚗今天给大家分享的是HTTPS加密的工作过程。

清风的CSDN博客

🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛 

目录

一、JVM类加载总体了解 

二、加载  

 三、连接

3.1 验证 

3.2 准备 

3.3 解析

四、初始化 

 五、类加载过程中的双亲委派模型

5.1 什么是双亲委派模型

5.2 双亲委派模型对类加载的基本描述流程 

5.3 双亲委派模型的优点 


一、JVM类加载总体了解 

5 步是固定的顺序并且也是类加载的过程,其中中间的 3 步都属于连接,所以对于类加载来说总共分为以下几个步骤:
  • 加载
  • 连接(验证、准备、解析)
  • 初始化

下面我们分别来看每个步骤的具体执行内容。

二、加载  

加载 Loading )阶段是整个 类加载 Class Loading )过程中的一个阶段,它和类加载 Class
Loading 是不同的,一个是加载 Loading , 另一个是类加载 Class Loading,所以不要把二者搞混了。

在加载 Loading 阶段,Java虚拟机需要完成以下三件事情:

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

 三、连接

3.1 验证 

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

验证选项: 文件格式验证、字节码验证、符号引用验证...

3.2 准备 

准备阶段是正式为类中定义的变量(即静态变量,被 static 修饰的变量)分配内存并设置类变量初始值的阶段。

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

public static int value = 123;

 它是初始化 value int 值为 0,而非 123

3.3 解析

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

四、初始化 

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

总结: 

Java程序最开始是一个 .Java 文件,经过编译成了 .class文件(字节码文件)。运行Java程序,JVM就会读取 .class 文件,把文件内容放到内存中,并且构造成 .class 对象。(类对象)

①加载:找到 .class 文件,打开文件读取内容,尝试解析格式。

②验证:检查一下当前 .class 文件的格式是否符合要求。

③准备:给类对象分配内存,并 “初始化”。

④解析:针对字符串常量的初始化。

⑤初始化:对类对象进行更具体的初始化操作。初始化静态成员、执行静态代码块、加载父类。

 五、类加载过程中的双亲委派模型

5.1 什么是双亲委派模型

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

  • 启动类加载器:加载 JDK lib 目录中 Java 的核心类库,即$JAVA_HOME/lib目录。 扩展类加载器。加载 lib/ext 目录下的类。
  • 应用程序类加载器:加载我们写的应用程序。
  • 自定义类加载器:根据自己的需求定制类加载器。

5.2 双亲委派模型对类加载的基本描述流程 

  • BootStrap ClassLoader : 负责加载标准库中的类
  • Extension ClassLoader : 负责加载 JVM 扩展的库
  • Application ClassLoader : 负责加载第三方库
  • 从 Application ClassLoader 开始,不会立即就搜索第三方库的目录,而是先把加载任务委派给父类加载器,让父类尝试加载。
  • 到了 Extension ClassLoader ,也是把加载任务委派给父类加载器,让父类尝试加载。
  • 最后,到了 BootStrap ClassLoader , 也不想立即搜索标准库,但是它没有父类加载器,只能自己动手。如果找到了要搜索的类,就执行后续加载(就用不着下面的两个子类加载器了)。如果没找到,任务就会交给子类加载器。
  • 此时任务回到了 Extension ClassLoader,就会搜索扩展库的目录,看是否有 .class 文件。若找到,执行后续加载。否则把任务交给子类加载器。
  • 任务又回到了 Application ClassLoader ,就要搜索第三方库的目录,(往往是我们自己项目的目录) ,如果找到,执行后续加载,否则抛出一个异常。

这样做的目的,就是明确优先级,避免程序员的代码对标准库的代码产生负面影响。 

那么一个类在什么时机会被加载呢?

  • ①构造类的实例。
  • ②使用类的静态方法/属性。
  • ③子类的加载触发了父类的加载。

类加载之后,后续使用就不必加载了,类对象已经是现成的了。 

5.3 双亲委派模型的优点 

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

✨好啦,今天的分享就到这里!

🎉希望各位看官读完文章后,能够有所提升。

✨创作不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论:你的意见是我进步的财富!

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

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

相关文章

Linux时间同步和时间设置

时间分为: 1、hwclock:用于查看硬件时间 hwclock -r(--show:读取硬件时钟并打印结果) :查看硬件时间 hwclock -s :系统时间向硬件时间同步 hwclock -w :硬件时间向系统时间同步 …

vue路由使用history模式部署线上报错ChunkLoadError: Loading chunk xxxxxx failed.

使用vue的history路由模式打包上线,发现控制台报错 点击其他路由模块,报错模块找不到 ChunkLoadError: Loading chunk runHotelCheckin failed. (missing: http://120.2.3.212:10082/infoManage/static/js/runHotelCheckin.dev.js?v1704359862052) 后面查找原因是vue.confi…

java基于SSM的游戏商城的设计与实现论文

基于SSM的游戏商城的设计与实现 摘 要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于游戏信息的管理和控制,采用人工登记的方式保存相关数据,这种以…

机器学习笔记 - 基于OpenCV+稀疏光流的无监督运动检测

一、简述 在各种高级开源库的帮助下,检测固定摄像机拍摄的运动行为是轻而易举可以实现的,但检测移动的摄像机拍摄的移动物体的运动检测依然是一个复杂的问题。在这里,我们将继续基于稀疏光流,并检测移动的无人机相机的运动。 这里…

html5中各标签的语法格式总结以及属性值说明

有关闭标签的元素 a元素 <a href"" target"" title""></a>表格相关元素 table元素&#xff1a;表格标签caption元素&#xff1a;表头thead元素tbody元素&#xff1a;表格主体元素tfoot元素th元素tr元素&#xff1a;行标签td元素&…

基于FFmpeg的短视频编辑工具Cut

前言 最近在学习FFmpeg和音视频的相关知识&#xff0c;为了加强对FFmpeg的认识和了解&#xff0c;于是撸了一个短视频编辑软件Cut。 效果图先行&#xff1a; 技术点 启动页优化 但启动app的时候会有一个短暂的黑屏或者白屏。为什么呢&#xff1f; 是因为在App启动时&#x…

试除法求约数算法总结

知识概览 试除法求一个数的约数的时间复杂度是。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/871/ 题解 用试除法求约数&#xff0c;…

Git - 强制替换覆盖 master 分支解决方案

问题描述 在版本迭代中&#xff0c;通常会保持一个主分支 master&#xff0c;及多个 dev 分支&#xff0c;但是因为 dev 分支的开发周期过长&#xff0c;迭代太多而没有及时维护 master &#xff0c;导致后来发版上线的大部分代码都在 dev 分支上&#xff0c;如果将代码在 mas…

报错处理:java.io.IOException: Could not find resource mybatis-config.xml

运行mybatis文件时出现了以下的情况 java.io.IOException: Could not find resource mybatis-config.xmlat org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:114)at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:100)at org.apach…

Flume基础知识(十):Flume 聚合实战

1&#xff09;案例需求&#xff1a; hadoop100上的 Flume-1 监控文件/opt/module/group.log&#xff0c; hadoop101上的 Flume-2 监控某一个端口的数据流&#xff0c; Flume-1 与 Flume-2 将数据发送给 hadoop102 上的 Flume-3&#xff0c;Flume-3 将最终数据打印 到控制台。…

企业数据库安全管理规范

1.目的 为规范数据库系统安全使用活动&#xff0c;降低因使用不当而带来的安全风险&#xff0c;保障数据库系统及相关应用系统的安全&#xff0c;特制定本数据库安全管理规范。 2.适用范围 本规范中所定义的数据管理内容&#xff0c;特指存放在信息系统数据库中的数据。 本…

web——德州扑克

1.此案例只用于学习 2.未接入游戏规则 HTML代码部分 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width"><meta name"Poker Skin" content&quo…