JVM核心之JVM运行和类加载全过程
为什么研究类加载全过程?
有助于连接JVM运行过程
更深入了解java动态性(解热部署,动态加载),提高程序的灵活性
类加载机制
JVM把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的java类型的全过程
加载
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,
在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,
这个过程需要类加载器参与。
链接
①将java类的二进制代码合并到JVM的运行状态之中的过程
②验证:确保加载的类信息符合JVM规范,没有安全方面的问题
③准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法去中进行分配
④解析:虚拟机常量池的符号引用替换为字节引用过程
初始化
①初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收藏类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生
②当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
③虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步
④当范围一个Java类的静态域时,只有真正声名这个域的类才会被初始化
1 public class Demo01 { 2 public static void main(String[] args) { 3 /*String str = "aaa"; 4 int a = 23435;*/ 5 //调用A类的方法 6 A a = new A(); 7 //注意打印出来的width的值和程序执行的顺序 8 System.out.println(a.width); 9 } 10 } 11 12 class A{ 13 public static int width = 100; 14 static{ 15 System.out.println("静态初始化A"); 16 width = 300; 17 } 18 public A(){ 19 System.out.println("创建A类的对象"); 20 } 21 }