类加载的过程~深入理解Java虚拟机
一、类加载过程总览
二、类加载的过程
1、加载(Loading)
所谓加载,简单来说就是将java类的字节码文件加载到机器内存中,并在内存中构建出java的原型,也是类模板对象。
通过类的全名,获取类的二进制数据流。
解析类的二进制数据流为方法区内的数据结构(Java类模型)
创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口
加载的类在JVM中创建相应的类结构,类结构会存储在方法区(JDKl.8之前:永久代;J0Kl.8及之后:元空间)
2、链接(Linking)
2.1、验证(Verification)
校验字节码文件的正确性
2.2、准备(Preparation)
给类的静态变量分配内存,并赋予默认值
2.3、解析(Resolution):
将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用
3、初始化(Initialization)
对类的静态变量初始化为指定的值,执行静态代码块
4、使用(Using)
5、卸载(Unloading)
当Sample类被加载、链接和初始化后,它的生命周期就开始了。当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。
参考
- 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
- JVM里的符号引用如何存储
😕/www.zhihu.com/question/30300585/answer/51335493)