目录
加载:
链接:
1.验证:
文件格式验证
元数据验证
字节码验证
符号引用验证
2.准备:
3.解析:
初始化:
类加载器:
将class文件读取到内存中,并且在堆中创建一个Class对象;
类的加载是由类加载器完成的(由JVM提供)——>当然我们也可以通过extendsClassLoader来创建自己的类加载器;
通过不同的加载器可以从不同的来源加载类的二进制数据(也就是加载字节码文件);
——>1.从本地内存中加载class文件(大部分);
2.Jar包形式;
.....(其余的还不知道)
类加载器通常无须等到“首次使用”该类时才加载该类,Java虚拟机规范允许系统预先加载某些类。(还不是很理解)
链接意思就是将字节码文件数据合并到JRE运行环境中(这也提现出Java的一次编译到处运行的特点了,字节码文件+运行环境=ojbk);
分为三部分:
检查被加载的类内文件格式是否规范,里面的信息是否符合要求,常量池中是否有不被支持的常量;
对字节码描述的信息进行语意分析,看它是否符合java语言语法的规范;
验证方法体,保证类方法在运行时不会出现危害;
整队符号引用——>直接引用,目的是保证引用一定会被访问到,不会出现访问不到的问题;
类准备阶段为类的静态变量分配内存,并且设置初始值;
将二进制数据中的符号引用替换为直接引用(直接引用可以理解为里面有地址,会被直接定位,跟内存的布局有关,因此需要加载进来);
为类的静态变量赋值(注意:这里不是赋的默认初始值,而是真正给的值)
具体流程:.class先被加载到内存——>先进行链接中的验证操作——>然后准备阶段,给变量分配内存,如果是static,根据基本类型赋值(初始值,比如int为0)——>解析(将一群符号变成直接引用)——>最后到初始化,把真正的值赋上;
(final修饰的基本类型变量,会在编译时期就赋值了,也就是说在准备时期就完成了(或者说链接吧)),但是如果是引用类型,那么赋值会在初始化完成;
类加载器负责加载所有的类,为这些被加载到内存的类生成一个Class对象(一个类被加载过了,就不会有第二次加载了),所以说每个Class对象都有个标识符(就是Class@xxxx那玩意);
这里有一个关于class字节码文件类加载的一个知识点;
(10条消息) 类加载一些理解(—)_Fairy要carry的博客-CSDN博客
当JVM启动时,类加载器有三种:
(10条消息) 深入理解Java类加载器(一):Java类加载原理解析_Rico's Blogs-CSDN博客_java类加载器
未完待续....