JVM基本知识——类加载机制

类加载机制

在运行java程序时,需要先将.java文件编译.class文件、然后再进行类加载,也就是将.class文件转换为二进制流并进行加载,并在内存中生成对应类的对象。

类加载完后,会在方法区形成类的字节码(二进制数据),在堆形成类的class对象

类加载器的类型

启动类加载器(Bootstrap ClassLoader):最顶层的类加载器,通过使用C++实现,主要负责加载Java的核心类库,如rt.jar、resources.jar基础核心类。启动类加载器无法被Java程序直接引用。

扩展类加载器(Extension ClassLoader):负责加载Java的扩展库,通常位于jre/lib/ext目录下,通过ClassLoader的getSystemClassLoader()方法可以获取该加载器。

系统类加载器(System ClassLoader):也叫应用程序类加载器,主要负责加载用户类路径(ClassPath)上制定的类,可以通过ClassLoader的getSystemClassLoader()方法可以获取该加载器。

自定义类加载器(Custom ClassLoader):继承java.lang.ClassLoader实现用户自己的类加载器,通常用来加载一些特殊的类,比如从网络、数据库或特定的二进制流中加载类。

类加载的三个阶段

加载Loading

通过类的完全限定名(完整路径),查找此类字节码文件(class 文件即二进制文件),利用字节码文件创建Class对象。将二进制文件的静态存储结构转化为方法区的运行时数据结构。利用二进制文件创建Class文件,在堆中创建类的实例。

连接Linking

连接阶段可以细分为验证、准备、解析。

验证

主要对文件格式、元数据、字节码、符号引用进行验证,确保字节流中包含的信息符合当前虚拟机的要求,保证不会危害虚拟机安全。

准备

为类变量(static变量)分配内存,并设置该类变量的默认初始值(不包括用final修饰的变量),例如,int类型的静态变量会被初始化为0。

解析

将类的二进制数据中的符号引用替换为直接引用

初始化initilzation

执行为静态变量赋初值动作和静态块的执行。

双亲委派机制

加载时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器,如果父类加载器能够完成加载的就返回,不能子类加载器才会自己尝试加载。

优点:避免类的重复加载、避免java的核心Api被篡改

相关推荐
荣码2 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev3 小时前
Gson → kotlinx.serialization
android·java·kotlin
小bo波12 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯13 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
SamDeepThinking1 天前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好1 天前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng1 天前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking1 天前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试