类的加载机制
JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成JVM可以直接使用的Java类型的过程。
加载 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类文件的java.lang.Class对象,作为方法区类数据的访问接口。-----这个过程需要类加载器参与 链接 验证:确保加载的类信息符合JVM规范,没有安全方面的问题 准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配 解析:虚拟机常量池内的符号引用替换为直接引用的过程。 初始化 初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集类中所有变量的赋值动作和静态语句块中的语句合并产生的。 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先将其父类进行初始化。 虚拟机会保证一个类的<clinit>()方法在多线程环境中能被正确的加锁和同步。 当访问一个java类的静态域时,只有真正声明这个域的类才会被初始化。 jvm执行类加载的顺序
首先在一个类中找到主函数。主函数中实例化了一个类 这时候首先执行这个类中的静态代码块 在执行类的构造方法, 然后再执行类中的其他方法 方法区:
静态变量 静态方法 常量池 类的代码 堆: java.lang.Class对象 栈: main方法的栈 静态变量与静态域其实是一回事