1. 加载:通过类加载器把 .class 文件读入到一个字节数组,然后产生Class对象。
a ) Bootstrap ClassLoader:负责加载存放在jre\lib下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类)。启动类加载器是无法被Java程序直接引用的。
b )Extension ClassLoader:负责加载jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。它的父加载器是 Bootstrap ClassLoader。
c ) Application ClassLoader:负责加载用户类路径(环境变量classpath)所指定的类或者系统属性 java.class.path 所指定的目录中的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。它的父加载器是Extension ClassLoader。
d ) User-defined ClassLoader:负责用户指定类的加载,继承在Application ClassLoader。
2. 验证一共有四个步骤:
a)文件格式的验证:验证文件格式符合Java类的文件格式规范,确保进入内存方法区的字节流符合规范。
b)元数据的验证:语法分析确保符合Java语法规范。
c)字节码验证:对类的方法进行验证,确保不会对JVM产生安全危害。
d)符号引用验证:为解析阶段符号引用转变为直接引用做准备。对常量池中的各种符号引用做匹配性校验。
3. 准备:
为静态变量分配内存并设置默认的初始值。
4. 解析:
将符号引用替换为直接引用。
5. 类初始化:
a)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类。
b)如果类中存在初始化语句,就依次执行这些初始化语句。