JVM类加载机制

1、类的生命周期:加载、连接(验证、准备、解析)、初始化、卸载;
2、JVM对什么时候加载类没有明确的规定,但对初始化有明确规定:
1)遇到new、getstatic、putstatic、invokestatic字节码指令时,如果类没有进行过初始化,则需触发其初始化;
2)、使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需触发其初始化;
3)、当初始化一个类时其父类没有进行过初始化,则需要触发其父类的初始化;
4)虚拟机启动时,用户需要指定主类,虚拟机会先初始化主类;
5)、当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic的方法句柄时,这个方法对应的类没有初始化化;
java常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用定义常量的类,因此不会触发定义常量的类的初始化。
JVM类加载过程:
1)、加载:这个过程虚拟机需要完成3件事:
a、通过类的全限定名来获取定义类的二进制字节流;
b、将字节流所代表的静态存储结构转化为方法区的运行时数据结构;
c、在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个累的各种数据的访问入口;
2)、连接:
a、验证:确保Class文件的字节流包含的信息符合当前虚拟机的要求,不会危害虚拟机自身的安全;
b、准备:为类变量(被static修饰的变量)分配内存并设置类变量的初始值,这些变量都在方法区中分配内存;
c、解析:虚拟机将常量池中的符号引用(字面量,字段描述符/字段名、方法描述符/方法名、类或接口的全限定名)替换为直接引用(直接指向目标的指针、相对偏移量或间接能定位到目标的句柄);
3)、类初始化过程是类加载过程中的最后一步,初始化类变量和其他资源;

你可能感兴趣的:(JVM类加载机制)