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被篡改

相关推荐
Humbunklung2 分钟前
Rust枚举:让数据类型告别单调乏味
开发语言·后端·rust
Y1nhl5 分钟前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
OEC小胖胖18 分钟前
深入理解 Vue.js 响应式原理及其在 Web 前端开发中的应用
开发语言·前端·javascript·vue.js·web
qq_4017004121 分钟前
C语言中位运算以及获取低8位和高8位、高低位合并
c语言·开发语言·算法
yanjiaweiya25 分钟前
云原生-集群管理
java·开发语言·云原生
gadiaola33 分钟前
【JavaSE面试篇】Java集合部分高频八股汇总
java·面试
艾迪的技术之路1 小时前
redisson使用lock导致死锁问题
java·后端·面试
qianbo_insist1 小时前
c++ python 共享内存
开发语言·c++·python
今天背单词了吗9801 小时前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题