类的加载过程

类加载机制

将描述类的数据信息从class文件中加载到内存上,然后进行数据验证、解析和初始化,这就是类加载过程,此过程是通过JVM完成的。
类的加载过程分为三个大阶段,分别是加载阶段、连接阶段和初始化阶段。其中连接阶段又分为验证、准备和解析三个阶段。

1.加载阶段

加载阶段就是JVM将我们所编写class文件中的二进制数据读入到内存,并将这些静态数据转换成方法区中的运行时数据结构,在堆区获取一个class对象(通过反射机制,但也可以不在堆上),作为方法区数据的访问入口。
类的加载过程_第1张图片
类的加载是由类加载器完成的,类加载器是由JVM所提供的,JVM自定义有三种类加载器,并且他们是逻辑上的继承关系,并不是我们经常所说的extends
1)启动类加载器(Bootstrap class loader):其负责加载JAVA-HOME/jre/lib/.jar路径下的是由C++实现的核心类库(Object类)之类的
2)扩展类加载器(Extensions class loader):其负责加载JAVA-HOME/jre/lib/ext/.jar路径下的类库
3)应用程序类加载器(Appclass class loader):其主要负责自定义的类和classpath路径下的
当然我们还可以自定义类加载器,但是必须继承ClassLoader
双亲委派模型
双亲委派模型是类的主要加载机制

类的加载过程_第2张图片双亲委派模型的工作原理就是如果一个类加载器收到了加载请求,它并不会忙着自己先去加载,而是把这个请求委托给自己的父类加载器去执行,如果父类加载器上面还存在着父类加载器那就继续向上委托,直到委托到最顶级的启动类加载器,然后从最顶级的启动类加载器开始尝试加载这个请求,如果父类加载器可以完成此加载请求那就返回成功,如果父类加载器不能加载此任务,就又会一层一层丢给它的子类加载器去完成。

双亲委派模型优点:

双亲委派模型最主要的优势就是安全,可以避免创建过多重复的类。
因为一个类只会被加载一次,而类加载器这种具有优先级层次关系导致无论哪一个类加载器要去加载一个类,最终都会先委派给最顶级的启动类加载器进行加载,所以Object类是不会被重复加载的。相反如果没有这种层级加载关系,那用户自定义的同名Object类放在classpath中,那系统中就会创建多个不同的Object类,对于开发者来说就无法调用系统原有的一些常用的方法了,这就是一个灾难性的后果了。不过这种复杂的层级关系应该会影响程序的执行效率,因为你每去加载一个类都要先通过这种层级关系去逐一审查而不是直接去加载,虽说C是底层语言,但这也许也是JAVA效率不如C++高的原因之一,不受ACM的欢迎,不过毕竟鱼与熊掌不可兼得,安全还是前提。

2.链接阶段

验证:验证当前字节码文件中的二进制字符流是否符合虚拟机要求(魔数,版本号等)
准备:负责为类的静态变量分配内存,并设置默认初始值(即零值,各种类型的默认0值)
解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
即逻辑地址(.class)-> 物理地址(JVM)

3.初始化阶段

初始化阶段是为类变量赋予正确的初始值

你可能感兴趣的:(Java基础,类加载机制)