java类加载过程

简介

我们知道java程序运行时,.java文件会被编译器变成成.class文件。

类加载机制指的是将这些.class文件中的二进制数据读入到内存中,并对数据进行校验,解析和初始化。

最终,每一个类都会在方法区保存一份它的元数据,在堆中创建一个与之对应的Class对象。

java类加载过程_第1张图片
类加载主要用三个阶段:加载、连接、初始化

1.加载(Loading)

将不同的数据源(class文件、jar包、网络)转化为二进制字节流读入内存,并由类加载器生成java.lang.Class对象。

2.连接(Linking)

将类的二进制数据合并进JRE中。
连接可以分为:验证、准备、解析三个阶段。

1)验证:确保Class文件字节流符合当前虚拟机的要求,并且不会危机安全
对.class文件的文件格式、元数据、字节码、符号引用进行校验。

2)准备:静态默认初始化
给静态变量分配内存、进行默认初始化。

3)解析
jvm将常量池的符号引用替换成直接引用。简单的说将变量用能够解析的地址来代替。

什么是符号引用?
Java代码在编译期间,是不知道最终引用的类型,具体指向内存中哪个位置的,这时候会用一个符号引用,来表示具体引用的目标是"谁"。Java虚拟机规范中明确定义了符号引用的形式,符合这个规范的前提下,符号引用可以是任意值,只要能通过这个值能定位到目标。
什么是直接引用?
直接引用就是可以直接或间接指向目标内存位置的指针或句柄。

3.初始化

主要针对静态成员(类加载阶段),执行显示初始化进行赋值操作。
此阶段主要是执行clinit()方法,依次自动收集静态变量的赋值操作静态代码块中的语句并合并。

jvm会保证clinit()方法在多线程情况下正确的执行。

你可能感兴趣的:(java,java,开发语言)