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 类都是同一个类

posted @ 2019-03-02 17:18  扬州慢  阅读(144)  评论(0编辑  收藏  举报