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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 解析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 负责加载项目中自己写的类以及第三方库中的一些类

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

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

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

通过双亲委派模型,可以有效地避免类的重复加载和类的不一致性问题。


相关文章
|
4天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
48 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
11天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
9天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
11天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
59 1
|
15天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
73 5
|
30天前
|
PHP 开发者 UED
PHP中的异常处理机制解析####
本文深入探讨了PHP中的异常处理机制,通过实例解析try-catch语句的用法,并对比传统错误处理方式,揭示其在提升代码健壮性与可维护性方面的优势。文章还简要介绍了自定义异常类的创建及其应用场景,为开发者提供实用的技术参考。 ####
|
29天前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
121 1
|
30天前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
51 2
|
30天前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
50 2
|
1月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####

推荐镜像

更多