返回
独家揭秘:JVM双亲委派机制 - 深入浅出解析类加载之旅
后端
2024-01-23 03:07:48
在软件开发的世界里,程序的正确运行离不开一个个小零件——类(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 代码的执行过程,并避免常见的问题。