Java类加载机制

时间:2020-07-01 09:57:51   收藏:0   阅读:72

Java类加载机制

简介

类的加载:
将类的.class文件中的二进制数据读取到内存中,将其放在运行时数据区的方法区中,在堆内存中创建一个java.lang.Class对象,用来封装在方法区内的数据结构。

Class对象:
封装类在方法区内的数据结构,提供访问方法区的数据结构的接口。

注:不需要等到某个类被“首次使用”再加载,允许预先加载。

加载.class文件的方式:

类的生命周期

类加载的过程:

  1. 加载(loading)
  2. 连接
    • 验证(verification)
    • 准备(preparation)
    • 解析(resolution)
  3. 初始化(initialization)
  4. 使用(using)
  5. 卸载(unloading)

注:

加载

查找并加载类的二进制数据。

功能:

连接

验证

确保被加载的类的正确性。(非必要)

行为

准备

为类的静态变量分配内存(方法区),并将其初始化为默认值。

注意

解析

把常量池内的符号引用替换为直接引用的过程.

针对:类或接口,字段,类方法,接口符号,方法类型,方法句柄和调用点限定符.

符号引用:一组符号来描述目标,可以是任何字面量.

直接引用:直接指向目标的指针,相对偏移量或间接定位到目标的句柄.

初始化

为类的静态变量赋予正确的初始值.

设定方式:

初始化步骤

初始化时机

类被主动使用时导致类的初始化.

结束

类加载器

分类

注:三种类加载器相互配合进行加载的.

JVM类加载机制

类的加载方式

  1. 命令行启动应用时由JVM初始化加载.
  2. 通过Class.forName()方法动态加载.
  3. 通过ClassLoader.loadClass()方法动态加载.

Class.forName()ClassLoader.loadClass()的区别

双亲委派模型

简介

当一个类加载器收到类加载请求时,不会自己加载该类,而是委托父加载器.依次向上发出请求,直到传递到顶层的启动类加载器.只有当父加载器没有找到所需的类,无法完成加载时,子加载器才试图自己加载该类.

流程

  1. 当AppClassLoader加载一个class时,将类加载请求委派给父类加载器ExtClassLoader去完成.
  2. 当ExtClassLoader加载一个class时,先将类加载请求委托给BootStrapClassLoader去完成.
  3. 若BootStrapClassLoader加载失败,会使用ExtClassLoader尝试加载.
  4. 若ExtClassLoader也加载失败,则使用AppClassLoader加载,若加载失败,会报出异常ClassNotFountException.

优势

自定义类加载器

参考:

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!