🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

💡 详解类加载机制

🔄 解析双亲委派模型

⚖️ 例外与总结


img

理解 Java 的类加载机制和双亲委派模型是深入掌握 JVM 工作原理的关键一步。简单来说,类加载机制描述了 Java 类如何被加载到内存并初始化的全过程,而双亲委派模型则是这套加载过程中的一项核心设计原则,主要用于保证加载过程的有序和安全。

下面这个表格可以帮助你快速抓住核心概念。

核心概念

核心目标

关键机制/组件

类加载机制

将类的字节码数据从来源(如.class文件)加载到JVM内存,并转换成可被JVM直接使用的Java类型的过程。

加载(Loading)→ 连接(Linking,含验证、准备、解析)→ 初始化(Initialization)。

双亲委派模型

确保Java核心类库的安全,避免类的重复加载,保证类的唯一性。

类加载器的层次结构(启动→扩展→应用→自定义)与“自下而上”的委托加载规则。

💡 详解类加载机制

类加载机制不仅仅是“把Class文件读进内存”,它包含三个明确的阶段:

  1. 加载(Loading):通过类的全限定名获取其二进制字节流,将字节流所代表的静态存储结构转换为方法区的运行时数据结构,并在堆内存中生成一个代表该类的 java.lang.Class对象,作为访问这些数据的入口。

  2. 连接(Linking):这个阶段细分为三步:

    • 验证:确保Class文件的字节流符合JVM规范,保证虚拟机的安全,包括文件格式、元数据、字节码等的验证。

    • 准备:为类的静态变量(被static修饰的变量)分配内存并设置初始值(即数据类型的零值,如int的0)。但对于静态常量(static final),此阶段会直接赋予程序设置的值。

    • 解析:将常量池内的符号引用(一组描述所引用目标的符号)替换为直接引用(一个指向目标的指针、相对偏移量或能间接定位到目标的句柄)的过程。

  3. 初始化(Initialization):这是类加载的最后一步,执行类的构造器 <clinit>()方法的过程。该方法由编译器自动收集类中所有类变量的赋值动作静态语句块中的语句合并生成。JVM会保证在并发情况下,一个类的 <clinit>()方法能被正确地加锁同步,即一个类在内存中初始化后,其他线程无法再对其进行初始化。

类的初始化时机遵循“按需加载”或“懒加载”原则,常见的触发条件包括:使用 new关键字实例化对象、读取或设置一个类的静态字段(final静态常量除外)、调用类的静态方法,以及使用反射机制调用类时等。

🔄 解析双亲委派模型

双亲委派模型是Java类加载器工作时所遵循的一种模型。

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

  • 类加载器层次:主要包含三层(JDK 8及之前):

    • 启动类加载器(Bootstrap Class Loader):最顶层的加载器,由C++实现,负责加载Java的核心类库(如rt.jar)。

    • 扩展类加载器(Extension Class Loader):负责加载JAVA_HOME/lib/ext目录下的类库。

    • 应用程序类加载器(Application Class Loader):也叫系统类加载器,负责加载用户类路径(classpath)上指定的类库。

双亲委派模型的作用主要体现在:

  1. 避免类的重复加载:通过委派机制,一个类只会被一个加载器加载,确保了类的唯一性。

  2. 保护程序安全,防止核心API被篡改:例如,用户自定义一个java.lang.Object类,由于双亲委派机制,加载请求会最终委派给启动类加载器,而启动类加载器会加载核心库中的Object类,用户自定义的Object类不会被加载,这保证了核心类库的安全。

⚖️ 例外与总结

尽管双亲委派模型是主流,但在一些特定场景下会被打破。例如,OSGi框架、Tomcat等Web容器为了实现应用隔离、热部署等功能,采用了不同的类加载策略(如优先加载Web应用自身类),这实际上破坏了标准的双亲委派模型。

总的来说,Java的类加载机制是JVM运行程序的基石,而双亲委派模型是这套机制稳定高效运行的重要保障。理解它们,对于解决日常开发中可能遇到的类冲突、理解框架原理(如Spring的IoC、动态代理)以及进行性能优化都至关重要。

希望这些解释能帮助你更好地理解这两个核心概念。如果你对某个特定场景(比如如何自定义类加载器)有进一步的兴趣,我们可以继续深入探讨。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐