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

相关推荐
木向7 分钟前
leetcode22:括号问题
开发语言·c++·leetcode
comli_cn9 分钟前
使用清华源安装python包
开发语言·python
筑基.15 分钟前
basic_ios及其衍生库(附 GCC libstdc++源代码)
开发语言·c++
m0_7482451729 分钟前
Web第一次作业
java
小码的头发丝、29 分钟前
Java进阶学习笔记|面向对象
java·笔记·学习
雨颜纸伞(hzs)30 分钟前
C语言介绍
c语言·开发语言·软件工程
J总裁的小芒果31 分钟前
THREE.js 入门(六) 纹理、uv坐标
开发语言·javascript·uv
m0_5485147732 分钟前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript
坊钰1 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表