java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java类加载机制

Java类加载机制从.class文件到JVM运行时

作者:RTower

本文详细介绍了Java类加载机制,包括Java程序的运行流程、类的生命周期与类加载、类加载器和双亲委派模型,通过类加载器将.class文件加载到内存中,并转换为JVM可以使用的运行时数据结构,最终实现类的初始化,感兴趣的朋友跟随小编一起看看吧

首先先贴上一张Java类加载的思维导图

一、Java 程序运行流程

在Java中,一个程序的起点是.java源文件,它经由javac编译器编译为字节码.class文件。随后,Java虚拟机(JVM)负责加载这些字节码文件,并将其转换为与操作系统交互的机器指令来执行。我们可以用以下流程图来概括这个宏观过程:

二、类的生命周期与类加载

而我们今天要深入剖析的,正是JVM将.class文件中的二进制数据读入内存,并转换成JVM可以使用的运行时数据结构的整个过程——类加载。要理解类加载,就离不开类的完整生命周期。下图展示了包含类生命周期的完整视图:

从上图可见,我们通常所说的“类加载”是一个广义概念,它主要指生命周期中“加载”和“连接”两大阶段,具体可细分为以下五个核心部分:

三、Java类加载器

类加载器是实现“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作的代码模块。

JVM提供了三层类加载器,它们之间以组合关系协同工作:

除了这三个系统提供的类加载器,用户还可以通过继承java.lang.ClassLoader类的方式,定制自己的类加载器,以满足特殊的需求(如热部署、从网络或加密文件中加载类等)。

四、双亲委派模型

1. 工作流程

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器(这里的父子关系一般通过组合而非继承来实现)。它的工作流程是:

当一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一层的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。

只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

2. 核心优势

3. 破坏双亲委派模型

双亲委派模型并非强制性约束。在某些场景下它会被打破,例如:

到此这篇关于Java类加载机制从.class文件到JVM运行时的文章就介绍到这了,更多相关java类加载机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文