JVM——类加载子系统

news/2024/3/29 0:06:49/文章来源:https://blog.csdn.net/chenxingxingxing/article/details/127446670

文章目录

    • 一、类加载器子系统作用
    • 二、类加载过程
      • 1、加载(Loading)
      • 2、验证(Verification)
      • 3、准备(Preparation)
      • 4、解析(Resolution)
      • 5、初始化(Initialization)
    • 三、类加载器
      • 1、类加载器分类
      • 2、类加载器特点
    • 四、双亲委派机制

一、类加载器子系统作用

  • java编译后生成的.class文件(字节码文件),需要在JVM的类加载子系统处理下加载到内存中,能被加载的字节码文件都是以CA FE BA BE开头。
  • 类加载子系统只负责字节码文件的加载,加载后是否能正常的执行,需要JVM另一个结构执行引擎决定。
  • 经过加载后的字节码文件对应到内存中,生成大的Class实例,同时对静态变量等做初始化。

二、类加载过程

类加载过程总体分为Loading(加载)、Linking(链接)、Initialization(初始化)三个环节,在Linking阶段又细分为Verification(验证)、Preparation(准备)、Resolution(解析)三个环节。
在这里插入图片描述

1、加载(Loading)

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

2、验证(Verification)

验证字节码文件的字节流中包含信息符合虚拟机规范,以防止不正常的字节流危害虚拟机安全。所有能被JVM识别的字节码文件,它的有效起始都是CA FE BA BE,它是JVM识别的一个标识。

在这里插入图片描述

3、准备(Preparation)

  1. 为静态变量分配内存并且赋默认初始值,不同类型初始值不同

    数据类型零值
    int0
    long0L
    short(short)0
    char‘\u0000’
    byte(byte)0
    booleanfalse
    float0.0f
    double0.0d
    referencenull
  2. 如果 static 变量是 final 的基本类型,以及字符串常量,那么编译阶段值就确定了,赋值在准备阶段完成

  3. 如果 static 变量是 final 的引用类型,即new的对象,赋值在初始化阶段完成

4、解析(Resolution)

解析阶段特点现在看不是太理解,可能需要学了JVM其它结构才懂。。。

  1. 将常量池内的符号应用转换为直接引用。
  2. 符号引用是一组来描述所引用的目标。直接引用就是直接指向目标的指针、相对偏移量或者一个间接定位到目标的句柄。
  3. 解析操作往往会伴随着JVM在执行完初始化之后在执行。
  4. 解析操作主要针对类的接口、字段、类方法、接口方法、方法类型等。

5、初始化(Initialization)

在字节码文件中,一个类的方法会被解析到methods文件目录下,构造器对应目录下的<init>()方法, main()就对应main()。
在这里插入图片描述

  1. 初始化阶段就是执行类构造方法<clinit>()的过程。这个方法不需要定义,它是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并来的。当一个类没有类变量的赋值动作和静态代码块,那字节码文件中就不存在<clinit>()方法,反之存在。在这里插入图片描述

  2. 构造器方法中的指令按照语句在源文件中出现的顺序执行。

  3. <clinit>()不同于类的构造器,类的构造器在虚拟机视角下是<init>()方法。

  4. 如果该类具有父类,JVM在保证子类的<clinit>()执行之前,父类的<clinit>()方法已经执行完毕。

  5. JVM必须保证一个类的<clinit>()方法在多线程下被同步加锁。

三、类加载器

1、类加载器分类

JVM支持两种类型类加载器,分别为引导类加载器和自定义类加载器。

在这里插入图片描述

2、类加载器特点

  1. JVM规范里面规定,只要派生自抽象类ClassLoader的类加载器都叫自定义类加载器;ExtClassLoader就是扩展类加载器,AppClassLoader是系统类加载器。在这里插入图片描述

  2. 四种类加载器不是继承关系,而是包含关系。引导类加载器是存在于系统内部,由c++编写的;其它几种类型类加载器都可以获取到父类加载器,由上面包含关系可以看出,扩展类加载器父加载器是引导类加载器,系统类加载器父类是扩展类加载器,而用户自己编写类的是通过系统类加载器加载。可以通过getParent()方法获取该类加载器的父加载器。

    public class ClassLoaderDemo2 {public static void main(String[] args) {//        对于用户自己定义的类,默认使用系统类加载器加载。ClassLoader appClassLoader = ClassLoaderDemo2.class.getClassLoader();System.out.println("print: " + appClassLoader);
    //        print: sun.misc.Launcher$AppClassLoader@18b4aac2//        对于系统类加载器,通过getParent()方法获取其父加载器ClassLoader appClassLoaderParent = appClassLoader.getParent();System.out.println("print: " + appClassLoaderParent);
    //        print: sun.misc.Launcher$ExtClassLoader@1b6d3586//        对于扩展类加载器,通过getParent()获取不到其父加载器,因为引导类加载器不是用java语言实现的ClassLoader extClassLoader = appClassLoaderParent.getParent();System.out.println("print: " + extClassLoader);
    //        pint: null}
    }
    
  3. 不同类加载器加载不同目录下的文件

    1. 引导类加载器加载以下目录:
      在这里插入图片描述

    2. 扩展类加载器加载以下目录:

    3. 系统类加载器加载目录:环境变量classpath或者系统属性java.class,path指定目录下的类库

  4. 类的加载一般依靠引导类、扩展类、系统类相互配合执行,在特定场合下,开发人员可以自己定义类的加载器。自己定义类的加载器需要继承抽象类ClassLoader,重写findClass()方法;或者直接继承URLClassLoader。

四、双亲委派机制

JVM对字节码文件采取按需加载,就是只有在使用到这个类的时候才会加载,生成class对象放到堆中。加载某个类的class文件时,JVM采取双亲委派机制,就是把加载请求向上委派父类处理,一直到引导类加载器;如果父类加载器无法加载,会将加载请求向下分配给子类。
具体加载机制:在这里插入图片描述

  1. 一个类加载器收到加载请求,他不会先去加载,而是先向上委托父类加载器加载;
  2. 父类加载器还存在父类,继续向上委托直到引导类加载器;
  3. 引导类加载器可以加载,就成功返回;若无法加载,就向下分配给扩展类加载器;
  4. 扩展类加载器可以加载,成功返回;若无法加载,向下分配给系统类加载器。
    在这里插入图片描述

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

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

相关文章

SpringCloud微服务实践之三 创建子项目UserService

创建子项目UserService&#xff0c;并将服务注册到Eureka UserService子项目作为用户信息的服务提供方&#xff0c;通过本项目&#xff0c;可以实现对基于Docker运行的mysql数据库表的读取。 1、在父项目上点击鼠标右键选择new→Module&#xff1a; 过程同上&#xff0c;略过…

基于jeecgboot的flowable驳回修改以及发起人设置

昨晚升级代码生成器&#xff0c;支持生成权限注解和菜单的SQL,修改驳回bug,以后保存流程强制要求第一个用户任务节点必须是发起人节点。 1、前端增加发起人设置 <el-radio label"INITIATOR">发起人</el-radio> 相应代码 if (this.containsKey(this.bpmn…

MybatisPlus【SpringBoot】 3 基本CRUD

MybatisPlus【SpringBoot】 【【尚硅谷】2022版MyBatisPlus教程&#xff08;一套玩转mybatis-plus&#xff09;】 3 基本CRUD 文章目录MybatisPlus【SpringBoot】3 基本CRUD3.1 BaseMapper3.2 插入3.3 删除3.3.1 通过id 删除记录3.3.2 通过id 批量删除记录3.3.3 通过map 条件…

【Svelte】-(7)绑定|Each 块绑定 / audio video 媒体标签绑定 / client offset 尺寸绑定 / this / 组件绑定

文章目录Each 块绑定媒体标签绑定尺寸绑定this组件绑定Each 块绑定 您也可以在 Each 的过程中使用。 不过需要注意的是&#xff0c;与这些 <input> 交互会改变数组。当要使用不可变数据&#xff0c;应该去避免使用这些绑定&#xff0c;并且改用事件来处理这些内容。 <…

nvm切换node版本

在实际的前端开发过程中&#xff0c;可能会经常遇见 node.js 的版本问题&#xff0c;不同的项目需要使用不同的 node.js 版本。比如Vue2和Vue3需要的Node版本不一样。 地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases 注意&#xff1a;安装之前必须完…

[LCT刷题][树链信息维护] P4332 [SHOI2014]三叉神经树

写在前面 把黑题看成蓝题结果想了老半天感觉不对劲 本题对于理解SplaySplaySplay和LCTLCTLCT结构具有至关重要的意义&#xff0c;值得反复思考。 可能因为我比较菜 题目思路 题目给定一个类似神经网络的东西&#xff0c;每个节点都具有激活层、三输入单输出&#xff0c;输…

node.js+vue+Web的疫情大数据平台分析系统

以往的疫情防控管理事务处理主要使用的是传统的人工管理方式&#xff0c;这种管理方式存在着管理效率低、操作流程繁琐、保密性差等缺点&#xff0c;长期的人工管理模式会产生大量的文本文件与文本数据&#xff0c;这对事务的查询、更新以及维护带来不少困难。随着互联网时代的…

Google共码未来 与 C站 创造者的经历

本人仅参加一天活动 2022.9.14&#xff1b;吃喝拉撒全免费哈哈哈 大会主题&#xff1a;共码未来 looker、chromium、wouldnt、jetpack looker https://blog.csdn.net/WebEye_Marketing/article/details/116047404 chromium https://blog.csdn.net/arv002/article/details/1…

SEO和SEM的区别是什么,哪个效果更好一些

SEO指的是搜索引擎优化&#xff0c;SEM指的是搜索引擎影响&#xff0c;那么SEO和SEM的区别具体是什么&#xff1f;对于初创业的企业来说&#xff0c;哪个更好呢&#xff1f;下面&#xff0c;本文将介绍SEO和SEM的区别&#xff0c;帮助企业和公司网络人员理清这两者的优劣势。 S…

【力扣刷题】Day31——DP专题

文章目录七、子序列问题&#xff08;线性DP and 区间DP&#xff09;1、子序列&#xff08;不连续&#xff09;29.最长递增子序列&#xff08;LIS&#xff09;30. 最长公共子序列 &#xff08;LCS&#xff09;31.不相交的线2、子序列&#xff08;连续&#xff09;32. 最长连续递…

C语言中的指针

一。什么是指针&#xff1f; 在计算机科学中&#xff0c;指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它的值直接指向&#xff08;points to&#xff09;存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元&a…

一棋盘的麦子

14天阅读挑战赛 有一个古老的传说&#xff0c;一位国王的女儿不幸落水&#xff0c;水中有很多鳄鱼&#xff0c;国王情急之下下令&#xff1a; 来&#xff0c;就把女儿嫁给他。”很多人纷纷退让&#xff0c;一个勇敢的小伙子挺身而出&#xff0c;冒着生命危险把公 一看是个穷小子…

Java程序员快速掌握前端知识

Java程序员是一个需要终身学习的岗位&#xff0c;加之技术更新迭代越来越快&#xff0c;程序员们不得不坚持提升自己&#xff0c;上班可能接触到新事物&#xff0c;下班也要抓紧时间钻研&#xff0c;才能不被时代淘汰。 前端技术&#xff0c;Java程序员可以不精通&#xff0c;…

新手如何自学python?

对于初学者来说&#xff0c;视频教程相比于书籍更加直观有效&#xff0c;可以先看视频进行学习&#xff0c;然后再看书进行深刻学习~下面就给你分享下教程以及书籍~ 网站 1. 网易公开课 https://open.163.com/ 2. 腾讯课堂 https://ke.qq.com/ 3. 中国大学慕课 https://www.…

xxl-job反序列化漏洞分析复现

01 影响范围 Xxl-Job<2.1.2&#xff0c;需要利用Hessian触发。 02 环境搭建 下载地址&#xff1a;https://github.com/xuxueli/xxl-job/releases 修改配置文件 xxl-job-2.0.1/xxl-job-admin/src/main/resources/application.properties 修改数据库信息&#xff0c;以及…

动手写数据库:实现记录管理

在数据库中&#xff0c;数据以”记录“作为一个单元来存储&#xff0c;例如一个表的“一行”就对应一条记录。假设我们有一个表叫STUDENT&#xff0c;其中有name, age, sex, class等字段&#xff0c;那么一条记录的信息就由这四个字段对应的信息合成。一条记录如何存储并不是一…

FFmpeg入门详解之110:RTSP协议讲解

RTSP亲手搭建直播点播 测试工具&#xff1a;VLC 数据源&#xff1a; 文件或本地摄像头 测试功能&#xff1a;RTSP直播点播 播放地址&#xff1a;rtsp://127.0.0.1:8554/rtspa001 服务端&#xff1a;推流 客户端&#xff1a;拉流 RTSP&#xff08;Real Time Streaming Pro…

Windows定时截屏、后台自动截屏工具,带有密码保护功能 —— 定时执行专家

目录 一、软件简介 二、使用教程 1、软件下载 2、软件的安装方法 3、无察觉自动截屏&#xff08;例如&#xff1a;间隔每 10分钟&#xff0c;执行 1次&#xff09; 一、软件简介 《定时执行专家》是一款制作精良、功能强大、简单易用、毫秒级精度、专业级的定时任务执行软…

Windows Server安全日志与系统事件变更审计

了解用户何时变更计算机内部时钟上的时间和日期。如果系统时间已变更&#xff0c;记录的事件将反映此新时间&#xff0c;而不是事件发生的实际时间。对系统时间不正确的变更可对应用程序造成严重破坏。 您可在Windows 2003 / 2008 / 2012计算机的安全日志中找到有价值信息&…

SpringBoot——可真是迅速又便捷

刚工作那会用的还是tomcat、springMVC、hibernate、mybatis、html、jsp……搭个项目可真是麻烦&#xff0c;各种复杂的结构还得打个war包配置web.xml&#xff0c;启动tomcat……后来也没做网站开发了&#xff0c;最近又看了看springboot&#xff0c;比之前那种开发web项目简单多…