java类加载的过程
类的加载大致分为五步
加载 校验 准备 解析 初始化
一 加载
主要完成三件事
1 通过一个类的全类名,获取该类的二进制流
2 将该类字节流所代表的静态存储数据结构 转换为 方法区的运行时数据结构
3 将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象, 作为方法区这个类的各种数据的访问入口。
简单来说 就是通过类加载器 把 文件加载到内存中,并在方法区为这个类创建一个入口
验证
验证是连接阶段的第一步, 这一阶段的目的是为了确保 Class文件的字节流中包含的信息符合当前虚拟机的要求, 井且不会危害虚拟机自身的安全。
Java语言本身是相对安全的语言,但,Class文件并不一定要求用 Java源码编译而来, 可以使用任何途径, 包括用十六进制编译器直接编写来产生 Class 文件。在字节码的语言层面上, 上述 Java代码无法做到的事情都是可以实现的, 至少语义上是可以表达出来的。
虚拟机如果不检査输入的字节流,对其完全信任的话, 很可能会因为载入了有害的字节流而导致系统崩溃 , 所以验证是虚拟机对自身保护的一项重要工作。从整体上看,验证阶段会完成下面四个阶段的检验过程: 文件格式验证、 元数据验证、 字节码验证、符号引用验证。不细看下去了,日后再说
准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配 。这个阶段中有两个容易产生混淆的概念需要强调一下, 首先,这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中 。 其次,这里所说的初始值“通常情况”下是数据类型的零值。
为静态变量初始化,但是还没有赋值,各种静态变量在这里还是初始值
解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程, 解新动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号。
引用进行,分别对应于常量池的CONSTANT_Class_info、 CONSTANT_Fieldref_info、CONSTANT_Methodref_info、CONSTANT_IntrfaceMethodref_info、CONSTANT_MethodType_info、CONSTANT_MethodHandle_info和CONSTANT_InvokeDynamic_info7种常量类型,解析阶段中所说的直接引用与符号引用关系如下:
符号引用(Symlxiuc References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量, 只要使用时能无歧义地定位到目标即可, 特号引用与配組机实现的内存1布.局11i-美 , 引用的日标并不一定已组加裁到内存中
直接引用(Direct References):直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是与虚拟机实现的内存布局相关的 , 同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同. 如果有了直接引用, 那引用的目标必定已经在内存中存在
这个解释没看懂 大概就是把符号引用转换为直接引用。符号引用和直接引用又是什么?
初始化
初始化阶段是类加载过程的最后一步 , 前面的几个阶段, 除了在加载阶段用户应用程序可以通过自定 义类加载器參与之外, 其余动作完全由虚拟机主导和控制。到了初始化阶段, 才真正开始执行类中定义的 Java程序代码。从代码角度,初始化阶段是执行类构造器<clinit>()方法的过程。
clinit不是对象构造器,是类构造器,用于类变量(静态变量初始化),为静态变量赋值
init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行init方法
加载(Loading)就是把类的.class文件读入Java虚拟机中;
而连接(Linking)就是把这种已经读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去 。
连接阶段分为三个子步骤——验证(Verification)、准备(Preparation)和解析(Resolution)。
验证步骤确保了Java类型数据格式正确并且适于Java虚拟机使用。
而准备步骤则负责为该类型分配它所需的内存、比如为它的类变量分配内存。
解析步骤则负责把常量池中的符号引用转换为直接引用。
需要注意的是
加载、 验证、准备和初始化这四个阶段的顺序是确定的,类的加载过程必须按照这种顺序接部就班地开始,而解析则不一定: 它在某些情况下可以在初始化阶段之后再开始, 这是为了支持 Java语言的运行时绑定 (也称为动态绑定或晩期绑定)。
引用链接
————————————————
版权声明:本文为CSDN博主「爆米花9958」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xuemengrui12/article/details/82707473
作者:凯玲之恋
链接:https://www.jianshu.com/p/3a47457ab2a2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
还看了一些其他帖子,就不一一列出来了