第7章 虚拟机类加载机制

来源:互联网 发布:unity3d 导弹跟随 编辑:程序博客网 时间:2024/05/01 03:20

类加载器之间的父子关系




一、类加载器的启动过程
JVM启动时,首先启动启动类加载器(Bootstrap ClassLoader),然后启动类加载器加载扩展类加载器(ExtClassLoader)和程序类加载器(AppClassLoader);
启动类加载器用于加载Java核心API,包括扩展类加载器和程序类加载器;扩展类加载器加载扩展API,即/lib/ext中的类;程序类加载器加载CLASSPATH目录下的Class
通常在没有指定ClassLoader的情况下,程序员自定义的类就由程序类加载器加载。

扩展类加载器和程序类加载器都是java类,都由启动类加载器加载;
启动类加载器不是java类,是嵌套在java虚拟机内核中的一段C++代码,随着虚拟机的启动而启动。

二、类加载器的委托机制
每个类加载器加载类时,先委托给其上级类加载器,一层一层向上直到祖宗类加载器;
当所有的祖宗类加载器都没有加载到类,则回到发起者类加载器,如果还加载不了,则抛出ClassNotFoundException。

三、类加载器加载类的过程
装载、连接、初始化。

装载:
找到相应的class文件,读入JVM。

连接(分三步):
1.第一步:验证。验证class是否符合规格。
2.第二部:准备。为类变量分配内存,设置默认初始值。
3.第三步:解析。这步是可选的,可以通过loadClass方法来设置。根据类中的符号引用查找相应的实体,再把符号引用替换成一个直接引用的过程。

初始化:
就是调用类构造器对class进行初始化。

四、类的唯一性
类的唯一性由类加载器和类本身一同确定;
只有由同一个类加载器加载的同一个类才有可能相等;
即使同一个类文件,只要由不同的类加载器加载,那这两个类就是不同的。
0 0