Java 类加载机制
类的生命周期
JVM类加载机制
分为五个部分:加载,验证,准备,解析,初始化
加载
这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的入口。
验证
确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
准备
正式为类变量分配内存并设置类变量初始值
解析
虚拟机将常量池内的符号引用替换为直接引用。(虚拟机将运行时常量池中那些仅代表其他信息的符号引用(例如字节码中的 #1,#2 等)解析为直接指向所需信息所在地址的指针。)
初始化
执行类构造器
类加载器
类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节码(.class 文件)。类加载器负责读取 Java 字节码,并转换成 java.lang.Class 类的一个实例。
关于类加载器需要了解:
类加载器的命名空间
对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类命名空间。也就是说,你现在要比较两个类是否相等,只有在这两个类是同一个类加载器加载的前提下才有意义。
双亲委派模型
JVM中有三种系统提供的类加载器:启动类加载器,扩展类加载器、应用程序类加载器。某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
该机制最大的好处就是让 Java 类同其类加载器一起具备了一种带优先级的层次关系。这句话可能不好理解,我们举个例子。比如我们要加载顶层的 Java 类——java.lang.Object 类,无论我们用哪个类加载器去加载 Object 类,这个加载请求最终都会委托给 Bootstrap ClassLoader,这样就保证了所有加载器加载的 Object 类都是同一个类