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

相关推荐
仙俊红几秒前
Spring Boot `@Configuration` 与 `@Component` 笔记
java·spring boot·笔记
小清兔2 小时前
c#基础知识
开发语言·数据库·学习·unity·c#·游戏引擎·.net
代码的余温2 小时前
Elasticsearch JVM调优:核心参数与关键技巧
大数据·jvm·elasticsearch
计算机学姐3 小时前
基于SpringBoot的社团管理系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·mybatis
天上掉下来个程小白3 小时前
微服务-25.网关登录校验-网关传递用户到微服务
java·数据库·微服务
奇某人4 小时前
【语法】【C+V】本身常用图表类型用法快查【CSDN不支持,VSCODE可用】
开发语言·vscode·markdown·mermaid
做一位快乐的码农4 小时前
php程序设计之基于PHP的手工艺品销售网站/基于php在线销售系统/基于php在线购物商城系统
开发语言·php
vivi_and_qiao4 小时前
HTML的form表单
java·前端·html
@珍惜一生@4 小时前
Qt开源库
开发语言·qt·开源
Slaughter信仰5 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第四章知识点问答补充及重新排版
java·开发语言·jvm