返回

独家揭秘:JVM双亲委派机制 - 深入浅出解析类加载之旅

后端





在软件开发的世界里,程序的正确运行离不开一个个小零件——类(Class)。在 Java 中,一切都以类的方式呈现,而加载这些类的过程便是类加载。在这场幕后之旅中,发挥着核心作用的便是双亲委派模型,一个看似简单却大有乾坤的机制。

双亲委派模型说白了,就是当一个类加载器需要加载一个类时,它首先会委托给它的父加载器进行加载。如果父加载器找不到这个类,它会继续委托给它的父加载器,依此类推,直到系统默认加载器或某个加载器成功加载了这个类。

这样做的好处显而易见:避免了类加载冲突。在 Java 的类加载机制中,加载器的层次结构起着决定性作用。它确保了系统默认加载器加载的类具有最高的优先级,防止了其他加载器加载的类与之冲突。

类加载器层次结构

了解了双亲委派模型的基础原理,我们再来看看类加载器层次结构。它是以系统默认加载器为根节点的一棵树形结构,其中包含了其他加载器,它们根据加载类的来源和范围而进行细分,包括以下主要类型:

系统默认加载器(Bootstrap ClassLoader):作为树的根节点,它负责加载 Java 运行时环境 (JRE) 中的核心类。这些类是 Java 语言本身必不可少的组成部分,包括 java.lang java.util 等基本包中的类。

扩展加载器(Extension ClassLoader):位于系统默认加载器之下,它主要负责加载扩展包中的类。扩展包通常包含一些第三方库和组件,由 Java 供应商提供,并与 JRE 一起安装。

系统类加载器(System ClassLoader):它的加载范围包括 Java 的核心类库,即 Java API 中的类。这些类通常存储在 Java 的 lib 目录中,例如常用的 java.net java.io 包中的类。

自定义加载器(Custom ClassLoader):顾名思义,它是由开发人员自己创建的加载器。它允许开发人员加载自定义的类,例如从网络或数据库中加载类。

通过双亲委派模型和类加载器层次结构的共同作用,Java 避免了类加载冲突,并实现了不同类加载器之间良好的协作。

类加载的过程

类加载的过程涉及以下几个步骤:

加载:在加载阶段,类加载器首先会读取类文件,并将其解析成字节码。

验证:在验证阶段,类加载器会对字节码进行一系列检查,以确保其符合 Java 虚拟机的规范。

准备:在准备阶段,类加载器会为类分配内存空间,并初始化静态变量。

解析:在解析阶段,类加载器会将类中的符号引用替换为直接引用。

初始化:在初始化阶段,类加载器会调用类的无参构造函数,执行类的静态代码块,完成类的初始化。

通过这几个步骤,一个类被完整地加载到 Java 虚拟机中,并可以被程序使用。

结语

双亲委派模型和类加载器层次结构是 Java 类加载机制的核心组成部分。通过它们,Java 有效地管理了类加载的过程,确保了类加载冲突的避免和不同类加载器之间的协作。了解这些机制对于 Java 开发人员来说是至关重要的,因为它可以帮助他们更好地理解 Java 代码的执行过程,并避免常见的问题。