解析Java类加载的运行机制和双亲委派模型

这篇具有很好参考价值的文章主要介绍了解析Java类加载的运行机制和双亲委派模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类加载运行机制

类加载形如把.class文件,加载到内存中,得到类对象这样的过程

类加载一共分为五个步骤:

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

加载

类加载的第一步是将编译好的 Java 类的字节码文件加载到 Java 虚拟机(JVM)中。类加载器会根据类的名称找到对应的字节码文件,并将其读取到内存中。

验证

在验证阶段,虚拟机会对加载的字节码文件进行合法性验证,包括文件格式的验证、验证字节码的正确性和安全性等。这一步主要用于确保 class 文件不会引起虚拟机的错误或安全问题。

准备

在准备阶段,虚拟机会为加载的类分配内存空间,并设置类的默认初始值。这些初始值包括零值(0、false或null)或者用户所设置的初始值。

解析

解析阶段是将常量池中的符号引用转换成直接引用的过程。符号引用包括类、接口、字段和方法等的引用。解析操作的主要目的是为了创建对应的直接引用,以便于后续的内存空间分配、类的初始化和方法的调用等操作。

在 Java 语言中,当我们在代码中引用一个类、接口、字段或方法时,实际上是通过符号引用来表示的。符号引用是一种符号化的描述方式,它并不指向具体的内存地址或偏移量,而是通过符号的形式来描述所引用的目标。

举个例子,假设有以下代码片段:


public class ClassA {
    public void methodA() {
        ClassB b = new ClassB();
        b.methodB();
    }
}

public class ClassB {
    public void methodB() {
        System.out.println("Method B is called");
    }
}

ClassAmethodA方法中,我们创建了一个ClassB的实例,并调用了它的methodB方法。

在解析阶段,虚拟机会进行如下的符号引用转换为直接引用的过程:

  1. 虚拟机会解析ClassAClassB的符号引用,找到对应的类ClassB的描述符和其他信息。
  2. 虚拟机会在内存中为ClassB分配空间,创建ClassB的实例对象。
  3. 虚拟机会将b变量与实际的内存地址关联起来,这样可以通过b来访问ClassB对象。
  4. 虚拟机会通过b.methodB()来调用ClassBmethodB方法,这里的methodB是一个直接引用。

所以,在解析阶段,虚拟机将符号引用转换为直接引用,这样就能够通过直接引用来访问和使用目标类的字段或方法。通过这种方式,虚拟机可以动态地解析和链接类之间的关系,实现类的动态绑定和调用。

初识化

在初始化阶段,虚拟机会执行类的初始化代码,例如静态变量的赋值和静态代码块的执行等。
这一阶段的触发条件包括:

  1. 类的实例被创建;
  2. 类的静态方法被调用;
  3. 类中的静态字段被赋值。

类的初始化是类加载的最后一个步骤。

双亲委派模型

双亲委派模型(又称为双亲委派机制)是Java类加载机制中的一种设计思想和实现方式
类加载机制是Java虚拟机(JVM)加载类的过程,而双亲委派模型是指在类加载过程中,JVM通过委派的方式来从不同的类加载器去加载类。这个机制主要用于确保类的一致性、安全性和避免重复加载。

在JVM中,有三个类加载器:

  • BootStrap ClassLoader 负责加载java标志库中的类
  • Extension ClassLoader 负责加载一些非标准的但是是Sun/Oracle 扩展的库的类
  • Application ClassLpader 负责加载项目中自己写的类以及第三方库中的一些类

解析Java类加载的运行机制和双亲委派模型,JavaEE,java,开发语言,学习,jvm
一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

双亲委派模型基于以下几个原则:

  1. 父类加载器优先:如果一个类需要被加载,JVM首先会把这个任务委派给父类加载器来完成。
  2. 双亲委派:父类加载器在接收到加载请求后,会先检查自己是否已经加载了这个类。如果已经加载,则直接返回该类的Class对象。如果没有加载,则将加载请求向上委派给父类的父类加载器,以此类推,直到顶层的启动类加载器。只有当父类加载器不能完成加载任务时,子加载器才会尝试自己去加载
    3.** 缓存机制:如果一个类被某个加载器加载成功后,这个加载器会将加载结果缓存起来,下次再加载同样的类时直接返回缓存的结果**。

通过双亲委派模型,可以有效地避免类的重复加载和类的不一致性问题。文章来源地址https://www.toymoban.com/news/detail-556384.html

到了这里,关于解析Java类加载的运行机制和双亲委派模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度解析JVM类加载器与双亲委派模型

    Java虚拟机(JVM)是Java程序运行的核心,其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念,并解释它们在实际开发中的应用。 1. 什么是类加载器? 类加载器是JVM的一部分,负责加载Java类的字节码文件。Java应用程序中的每个类都必须由类加载器

    2024年01月17日
    浏览(40)
  • 类加载 - 双亲委派机制详解

    启动类加载器(Bootstrap Class Loader):它是Java虚拟机的一部分,负责加载Java核心类库,如java.lang包中的类。它是最顶层的类加载器,由C++实现,不是Java类。 扩展类加载器(Extension Class Loader):它负责加载Java的扩展类库,位于JRE的lib/ext目录下。它是由Java编写的类加载器,是

    2024年02月12日
    浏览(31)
  • JVM类加载和双亲委派机制

    当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把类加载到JVM,本文主要说明类加载机制和其具体实现双亲委派模式。 类加载过程 : 类加载的过程是将类的字节码加载到内存中的过程,主要包括:加载--链接--初始化,其中链接还包括验证、准备、

    2024年02月09日
    浏览(32)
  • JVM:双亲委派机制&类加载器

    Java运行时环境有一个 java.lang 包,里面有一个 ClassLoader 类 我们自定义一个 String 类在 java.lang 包下,下面的main方法报错。原因是: 根据双亲委派机制,会向上找先是找到了 应用程序加载器(appClassLoader) ,然后向上找 扩展类加载器(ExtClassLoader) ,最后找 根类加载器(Boot Strap

    2024年02月01日
    浏览(27)
  • JVM(类的加载与ClassLoader、双亲委派机制)

    类在内存中完整的生命周期: 加载--使用--卸载 。其中加载过程又分为: 装载、链接、初始化 三个阶段。 当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、链接、初始化三个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成这三个步骤,

    2024年02月03日
    浏览(33)
  • 【JVM从入门到实战】(六)类加载器的双亲委派机制

    在Java中如何使用代码的方式去主动加载一个类呢? 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。 双亲委派机制: 自底向上查找是否加载过,再由顶向下进行加载 面试题:

    2024年02月04日
    浏览(39)
  • JVM类加载基本流程及双亲委派模型

    一个运行起来的Java进程就是一个JVM虚拟机,这就需要从操作系统中申请一片内存区域。JVM申请到内存之后,会把这个内存划分为几个区域,每个区域都有各自的作用。 一般会把内存划分为 四个区域 : 方法区 (也称 \\\"元数据区\\\"), 堆区 , 栈区 , 程序计数器 。 (1)方法区:

    2024年04月23日
    浏览(32)
  • JVM的类加载的过程以及双亲委派模型

    目录 1、加载 (加载字节码文件,生成.class对象) 2、验证(验证Class文件是否符合规范)  3、准备 (为静态变量分配内存并设置变量初始值) 4、解析(初始化常量池中的一些常量)  5、初始化(初始化对象,并为静态变量赋值)  总结: 双亲委派模型:   JVM的类加载器

    2023年04月20日
    浏览(34)
  • [JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他

    JDK1.8及之前和JDK9及之后的双亲委派模型是不一样的,这里学习了1.8及以前的双亲委派模型,记录笔记 1.8之前主要是这几种类加载器: 负责将存放在 JAVA_HOMElib 目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名,如rt.jar)类库加载到虚

    2024年02月16日
    浏览(38)
  • Java双亲委派和类加载器

    Java类加载分为以下几个步骤: 只有 加载步骤 中的 读取二进制流与初始化部分 ,能够被上层开发者,也就是大部分的Java程序员控制,而 剩下的所有步骤 ,都是由JVM掌控,其中细节由JVM的开发人员处理,对上层开发者来说是个黑盒。 面向对象SOLID: 单一功能、 开闭 、里氏替

    2023年04月26日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包