类加载机制
一、加载
将class文件字节码内容加载到内存中
步骤1:
将class文件字节码内容通过类加载器加载到内存中的方法区
步骤2:
将原本在字节码文件中的静态数据转换为方法区中的运行时数据结构(内存中的二进制)
步骤3:
在堆中生成一个代表这个类的java.lang.Class对象(反射对象指向方法区中的数据),作为方法区数据访问的入口。
二、链接
1、验证
确保加载的类信息符合JVM规范,没有安全方面的问题
2、准备
为类变量(static变量)分配内存并设置类变量默认值。注意:比方说在类中写有:static a=3;此时在准备阶段的设置默认值并不是3,而是0,3是在初始化阶段设置的
这些内存都将在方法区中进行
3、解析
将虚拟机常量池内的符号引用替换为直接引用
1、一个类中的类名、方法名、属性名等这些符号都是以常量的形式存在的。
2、当将一个类编译完加载到内存中的方法区后每一个类都会有一个常量池。
3、常量池中存放比方说,类名、方法名、属性名这种符号引用
4、但是常量池中的符号引用不能直接使用,需要通过解析变为直接引用也就是说当虚拟机区调用的时候可以直接调用
5、将符号引用转变为直接引用后需要指定一串符号对应的数据存放的地址。
6、这个地址可以是直接的地址,直接告诉你数据在哪里存放,也可以是相对地址
7、经过上述的解析工作之后程序就具有初始化和执行的条件
8、注:符号引用转变为直接引用:相当于是转为地址的过程:比方说我要从家里去超市买东西:
符号引用是:家、超市
直接引用:
家位于xxx镇15号,
超市:xxx镇26号(直接地址)
相对于家东南方向300米处(相对地址)
将抽象的符号转换为具体的地址这样要找到超市就比较方便了。