java文件经编译后的class文件由类加载子系统的类加载机制加载完之后得到DNA元数据模板(加载后的类),并储存在方法区
一、类加载机制执行流程
加载 —> 链接 —> 初始化
1、加载
加载过程
1)通过类的全路径获取类的二进制字节流
2)将这个二进制字节流静态的存储结构转化为方法区中运行时动态结构
3)在内存中生成一个代表这个类的 java.lang.class 对象,作为方法区中这个类的访问路口
2、链接
链接分为三个部分:验证 -> 准备 -> 解析
1)验证:验证主要是检查class字节流的信息是否符合虚拟机的要求(例如java的class字节码文件都以cafebaby开头),保证类被正确的加载且不会对虚拟机有危害
2)准备:为类变量(static)分配内存以及设置初始值。
注:如果属性被static final 修饰,那么它就不是变量,而是常量,常量在编译时就完成了初始化
3)解析:将常量池中的符号引用转化为直接引用
3、初始化
1)类的初始化就是执行类的加载器<clinit>的过程
2)<clinit>方法是由程序自动生成,作用为对类变量(static)按顺序进行赋值操作
3)子类的<clinit>方法加载前,父类的<clinit>方法要先加载
4)类加载在多线程时必须实现同步(jvm自动给类加载上锁),且第一个线程将类加载完毕后,将加载后的类信息放在方法区,之后的线程访问就不需要再次加载