前面两篇博客,我详细的讲解下Java主动内存管理的一些情况,如果想要更深入的了解Java虚拟机的运行机制的话,我建议可以阅读下《深入理解Java虚拟机》这本书。而这篇博客主要记录的是Java虚拟机是如何把.class文件加载到内存,具体的加载过程是怎么样的呢?请看下面的详细讲解。
首先,必须得明白类加载机制大致原理:虚拟机把描述类的数据从CLASS文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
再次,必须得记住类加载的时机。类加载的生命周期:加载、验证、准备、解析、初始化、使用和卸载; 连接包括:验证、准备和解析; !
2)类初始化(立即)条件:加载、验证、准备已结束 A
)遇到new, getstatic, putstatic, invokestatic指令时,如果累没有进行初始化,则需要先触发其初始化;对应的场景:使用new实例化对象;读取或设置类的静态字段;调用类的静态方法;
B)使用java.lang.reflect包的方法对类进行反射的时候;
C)当初始化一个类的时候,如果发现其父类没有初始化,需要先触发父类初始化;
D)当虚拟机启动时,要执行的主类,虚拟机会先初始化主类;
注意:(1)常量在编译期存入调用的常量池中,本质上没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
下面再好好讲下加载类每一步,虚拟机做了哪些事: