java类加载过程
- 加载:
将class文件字节码内容加载到内存中,将静态数据装换成方法区中的运行时数据结构,在堆中生成一个class对象,作为方法区类数据访问的接口。 - 链接:
将java类的二进制代码合并到JVM的运行状态之中的过程
. 验证:
确保加载的类信息符合JVM规范,没有安全方面的问题。
. 准备:
在方法区中为类变量分配内存并设置变量初始值。
(赋初值不是初始化,static int a=1;赋初值为0)
. 解析:
虚拟机常量池的符号引用改为直引用的过程 - 初始化:
①初始化阶段是执行类构造器clinit()方法的过程,由编译器自动收集类中的所有变量的赋值动作和static块中的语句合并产生的。
②当初始化类时,如果发现父类还没有初始化,则先初始化父类
③虚拟机会保证一个类的clinit()方法在多线程中被正确加锁和同步
④当访问一个java类的静态域时,只有声明这个域的类才会被初始化
(比如父类Parent有 static int a =1;调用子类Child.a,不会初始化子类)
⑤当访问类常量 static final修饰,是从常量池中拿,不会进行初始化