JVM 类加载机制笔记
JVM 类加载过程包括 5 个阶段(7 个部分):加载、检验、准备、解析、初始化、(使用、卸载)。
加载:查找并加载类的二进制文件。在这个阶段主要做三件事情:
通过类的全限定名来获取定义此类的二进制字节流。
将这个类字节流代表的静态存储结构转为方法区的运行时数据结构。
在堆中生成一个代表此类的 java.lang.Class 对象,作为访问方法区这些数据结构的入口。
连接
验证:检验被加载的类的正确性,属于连接阶段的第一步,目的是为了确保加载的 Class 文件的字节流包含的信息符合 JVM 的要求,不会危害到 JVM 自身的安全性。
准备:为类的静态变量分配内存,并将其初始化为默认值。
解析:把类中的符号引用转换为直接引用。
初始化:为类的静态变量赋予正确的初始值,JVM 负责对类进行初始化,主要是对类变量进行初始化。
类加载器
包括:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(ExtClassLoader)、应用类加载器(AppClassLoader)。
启动类加载器:负责加载存放在 JDK\jre\lib(JDK 代表 JDK 的安装目录,下同)下,或被-Xbootclasspath 参数指定的路径中的,并且能被虚拟机识别的类库(如 rt.jar,所有的 java.*开头的类均被 Bootstrap ClassLoader 加载)。启动类加载器是无法被 Java 程序直接引用的。
扩展类加载器:由 sun.misc.Launcher$ExtClassLoader 实现,它负责加载 DK\jre\lib\ext 目录中,或者由 java.ext.dirs 系统变量指定的路径中的所有类库(如 javax.*开头的类),开发者可以直接使用扩展类加载器。
应用类加载器:由 sun.misc.Launcher$AppClassLoader 来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/be30753881c0a0432f3240bae】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论