其他分享
首页 > 其他分享> > 类加载机制(一些简单的理解)——阶段性学习

类加载机制(一些简单的理解)——阶段性学习

作者:互联网

目录

加载:

链接:

1.验证:

文件格式验证

元数据验证

字节码验证

符号引用验证

2.准备:

3.解析:

初始化:

类加载器:


加载:

将class文件读取到内存中,并且在堆中创建一个Class对象;

类的加载是由类加载器完成的(由JVM提供)——>当然我们也可以通过extendsClassLoader来创建自己的类加载器;

通过不同的加载器可以从不同的来源加载类的二进制数据(也就是加载字节码文件);

——>1.从本地内存中加载class文件(大部分);

2.Jar包形式;

.....(其余的还不知道)

类加载器通常无须等到“首次使用”该类时才加载该类,Java虚拟机规范允许系统预先加载某些类。(还不是很理解)


链接:

链接意思就是将字节码文件数据合并到JRE运行环境中(这也提现出Java的一次编译到处运行的特点了,字节码文件+运行环境=ojbk);

分为三部分:

1.验证:

文件格式验证

检查被加载的类内文件格式是否规范,里面的信息是否符合要求,常量池中是否有不被支持的常量;

元数据验证

对字节码描述的信息进行语意分析,看它是否符合java语言语法的规范;

字节码验证

验证方法体,保证类方法在运行时不会出现危害;

符号引用验证

整队符号引用——>直接引用,目的是保证引用一定会被访问到,不会出现访问不到的问题;

2.准备:

类准备阶段为类的静态变量分配内存,并且设置初始值;

3.解析:

 将二进制数据中的符号引用替换为直接引用(直接引用可以理解为里面有地址,会被直接定位,跟内存的布局有关,因此需要加载进来);


初始化:

 为类的静态变量赋值(注意:这里不是赋的默认初始值,而是真正给的值

具体流程:.class先被加载到内存——>先进行链接中的验证操作——>然后准备阶段,给变量分配内存,如果是static,根据基本类型赋值(初始值,比如int为0)——>解析(将一群符号变成直接引用)——>最后到初始化,把真正的值赋上;

(final修饰的基本类型变量,会在编译时期就赋值了,也就是说在准备时期就完成了(或者说链接吧)),但是如果是引用类型,那么赋值会在初始化完成;


类加载器:

类加载器负责加载所有的类,为这些被加载到内存的类生成一个Class对象(一个类被加载过了,就不会有第二次加载了),所以说每个Class对象都有个标识符(就是Class@xxxx那玩意);

这里有一个关于class字节码文件类加载的一个知识点;

(10条消息) 类加载一些理解(—)_Fairy要carry的博客-CSDN博客

当JVM启动时,类加载器有三种:

(10条消息) 深入理解Java类加载器(一):Java类加载原理解析_Rico's Blogs-CSDN博客_java类加载器

未完待续....

标签:阶段性,Java,字节,验证,内存,理解,引用,加载
来源: https://blog.csdn.net/weixin_57128596/article/details/123037776