虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。
类型的加载、连接和初始化过程都是在程序运行期间完成的。这种策略虽然会令类加载时稍微增加一些性能开销,但是会为java应用程序提供高度的灵活性。java里天生可以动态扩展的语言特性就是就是依赖运行期动态加载和动态连接这个特点实现的。
到了初始化阶段,才是真正开始执行类中定义的java程序代码或者说是字节码。在准备阶段,变量已经赋值过一次系统要求的初始值,而在初始化阶段。则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。
由于父类的<clinit>()方法先执行,也就意味着父类中定义的静态语句块要优先于子类的变量赋值操作。
类加载器又启动类加载器、扩展类加载器、应用程序加载器。类加载器之间的这种层次关系,称之为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都要传送到顶层的启动类加载器汇总,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。