JVM 的类加载机制和双亲委派机制

1.基本概念:

在Java虚拟机(JVM)中,类加载机制是其核心组成部分之一,它负责将类(.class文件)加载到JVM的方法区内,并在需要时初始化这些类。本文将深入探讨JVM的类加载机制,特别是双亲委派模型的原理和应用。

2.类加载机制:

类加载机制包括加载、链接和初始化三个阶段:

(1).加载: 通过类的全限定名获取定义此类的二进制字节流,并在内存中创建一个代表该类的java.lang.Class对象。
(2).链接: 包括验证、准备和解析三个子步骤,确保加载的类信息符合JVM规范,为类的静态变量分配内存,并设置默认初始值,将常量池中的符号引用转换为直接引用。

验证(Verification):确保加载的类信息符合JVM规范,没有安全问题。

准备(Preparation):为类的静态变量分配内存,并设置默认初始值。

解析(Resolution):将常量池中的符号引用转换为直接引用。
**(3).初始化:**执行类的构造器方法<clinit>(),初始化类的静态变量和静态代码块。

3.双亲委派机制:

双亲委派机制(Parent Delegation Model)是 Java 类加载器的一种工作模式。

当一个类加载器去加载另一个类的时候,当前的类加载器会委托给其父类加载器查找是否加载过,如果加载过就直接返回,如果一直到最顶层加载器找不到,再由自顶向下进行加载。

4.类加载器的层次结构:

(1).启动类加载器(Bootstrap ClassLoader): 负责加载Java核心库,如rt.jar。
(2).扩展类加载器(Extension ClassLoader): 负责加载扩展库,如JAVA_HOME/lib/ext目录下的类库。
**(3).应用程序类加载器(Application ClassLoader):**也称为系统类加载器,负责加载应用程序类路径上的类库。

应用程序类加载器的父类为扩展类加载器,扩展类加载器的父类为启动类加载器。

5.双亲委派机制模型优点:

**(1).避免类被重复加载:**确保一个类只被加载一次,由最先找到该类的加载器进行加载。

**(2).保护核心类库的安全:**避免恶意代码替换JDK中核心类库,比如java.lang.String,确保核心类库的完整性和安全。

6.打破双亲委派机制:

(1).重写loadclass方法,不再实现双亲委派机制。

(2).JNDI.JDBC.JCE.JAXB和JBI等框架使用了SPI机制+线程上下文类架加载器。

(3).OSGI实现了一整套类加载机制,允许同级类加载器之间互相协调。

7.总结:

JVM 的类加载机制和双亲委派机制为 Java 提供了灵活和安全的类加载方式,确保应用程序的稳定和高效运行。通过掌握这些机制,开发者可以更好地理解和调试 Java 应用程序的运行过程。

相关推荐
欣栀♡2 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
czt_java3 小时前
JVM 核心基础|运行时数据区、类加载机制、GC 分代回收
jvm
Web极客码6 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
y = xⁿ6 小时前
一文掌握JVM
jvm
顺风尿一寸14 小时前
从 FileOutputStream 到 int fd:一次 JNI 字段读写全链路源码剖析
linux·jvm
用户0942485680314 小时前
第36章:JVMTI、Java Agent与运行时扩展点
java·jvm
脚踏实地,坚持不懈!15 小时前
Linux 内存回收机制:水位线、kswapd 与 Direct Reclaim
linux·jvm·算法
wuminyu15 小时前
ZGC染色指针在虚拟线程stackChunkOop上的并发屏障全景分析
java·linux·c语言·jvm·c++
江湖有缘1 天前
Docker实战 | 使用Docker部署rmoments社交平台
jvm·docker·oracle
H.莓飛2 天前
【C++】内存管理
linux·开发语言·jvm·c++·visual studio