JVM之类加载器(ClassLoader)基本介绍
类加载器用于将class文件加载到JVM中去执行。下面介绍类加载器涉及到的基本概念和加载基本过程。
一、Java虚拟机与程序的生命周期
在运行Java程序时,会启动JVM进程,该进程中会使用一个线程去执行我们的Java程序。在如下几种情况下,Java虚拟机将结束生命周期:
1.执行了System.exit(0)(内部调用了Runtime.getRuntime().exit(n)),如果是非0参数表示异常退出。
2.程序正常结束
3.程序在执行过程中遇到了异常或错误而导致异常终止。如果异常没有try-catch而一直throw,那么一直throw到main方法,
main方法还不处理的化那就会throw给JVM,JVM看到异常就会结束运行。
4.由于操作系统错误而导致的Java虚拟机进程终止
二、类的加载、连接与初始化
加载:查找并加载类的二进制数据到JVM
连接:分为三个步骤
Ø 验证:确保被加载类的正确性
Ø 准备:为类的静态变量分配内存,并将其初始化为默认值
Ø 解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值。(就是在类中定义变量时赋予的默认值)
以上的过程中并不会初始化对象变量,因为此时并不存在任何对象,只是将类的class文件数据加载到内存中,对象的生成是在该过程完成之后。
类中的静态代码块是按照声明的顺序执行的,例如:
static int a;
static {
a=1;
}
static{
a=2;
}
此时a的最终值是2,如果两个代码块颠倒顺序,那么a的最终值就是1。
三、类的主动使用与被动使用
Java程序中对类的使用可以分为两种:主动使用 和 被动使用。
1.Java程序对类的主动使用的情况
> 创建类的实例
> 访问某个类或接口的静态变量,或者对该静态变量赋值
> 调用类的静态方法
> 通过反射访问类,例如Class.forName(“package.ClassName”)
> 初始化一个类的子类,或访问子类的静态变量或静态方法也是对父类的主动使用。
> Java虚拟机启动时被标注为启动类的类,例如JUnit中的TestCase类。
所有的Java虚拟机实现必须在每个类或接口被Java程序首次主动使用时才初始化它们。因此Java虚拟机只有在一个类第一次
发生上面的六种情况时才会初始化该类,仅第一次主动使用时初始化。
除了以上的主动使用的情况,其它的情况都是对类的被动使用,因此都不会导致类的初始化。
类的加载、连接与初始化过程的详细分析(上)
一、类加载阶段
1.类加载方式
类的加载指的是将类的.class文件的二进制数据读入内存中,将其放在运行时数据区的方法区内。然后在堆区创建一个Java.lang.Class对象,
用来封装类在方法区内的数据结构,该对象是由JVM在加载类时创建的。所以每个类都会对应一个Class类型的对象,通过getClass()来获取,
并且无论生成该类的多个少对象,其Class类型的对象只有一个。Class类的构造方法是私有的,并且Class类的对象只有JVM才能创建,创建时机为加载.class文件时。
因此Class类是整个反射的入口&