Java类加载器

1、类的生命周期

在这里插入图片描述
从类被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证 (Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7 个阶段。 其中验证、准备、解析 3 个部分统称为连接(Linking)。
加载: 查找并加载类的二进制数据。(把类的.class 文件的二进制数据读入内存,存放在运行时数据区的方法区;类加载的最终结果是产生堆区中描述对应类的 Class 对象),加载类的时机并不需要等到某个类被主动使用时才加载,虚拟机会按需加载某个类。
连接: 包括验证、准备和解析三个子阶段

  • 验证:确保补加载类的正确性
  • 准备:为类的静态变量分配内存,并设定默认值;
  • 解析:把类中的符号引用转换为直接引用;

初始化: 给类中的静态变量赋予正确的初始值,初始化时机如下

  • 创建类(new、反射、克隆、反序列化);
  • 使用静态方法、非静态变量;
  • Class.forName获取描述类的Class对象;

使用: 当初始化完成之后,java 虚拟机就可以执行 Class 的业务逻辑指令,通过堆中 java.lang.Class 对象的入口地址,调用方法区的方法逻辑,最后将方法的运算结果通过方法返回地址存放到方法区或堆中。
卸载: 清除对应类的Class对象和类的二进制数据结构。由Java虚拟自带的三个类加载器加载的类不能卸载,用户自定义的类加载器加载的类可以被卸载。

2、Java类加载器

2.1、定义

Java 类加载器的作用是寻找类文件,然后加载 Class 字节码到 JVM 内存中,连接(验证、准备、解析)并初始化,最终形成可以被虚拟机直接使用的 Java 类型。

2.2、分类

在这里插入图片描述
启动类加载器: 由 C++语言实现的类加载器,它负责将JAVA_HOME/lib-Xbootclasspath等虚拟机识别的类库加载到内存中。由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用。 具体可由启动类加载器加载到的路径可通过System.getProperty(“sun.boot.class.path”)查看所有的路径。
扩展类加载器: 由 Java 语言实现的类加载器(sun.misc.Launcher$ExtClassLoader),它负责将JAVA_HOME /lib/ext或者-Djava.ext.dir虚拟机识别的类库加载到内存中。开发者可以通过 System.getProperty(“java.ext.dirs”)查看所 有的路径。
应用/系统程序类加载器: 由 Java 语言实现的类加载器(sun.misc.Launcher$AppClassLoader),它负责将-classpath或者-Djava.class.path虚拟机识别的类库加载到内存中。开发者可以通过 System.getProperty(“java.class.path”)查 看所有的路径。可以通过-Djava.system.class.loader指定具体的应用/系统程序类加载器。

2.3、双亲委派机制

在这里插入图片描述
类加载过程中,会先从最顶层加载器(一般是启动类加载器)开始往下,先判断父类加载器能不能加载,能加载则往下传递返回加载的类;不能加载则继续往下判断,如果都不能加载,则会抛出 ClassNotFoundException异常;加载器之间的父子关系实际上是指加载器对象之间的包装关系,而不是类之间的继承关系;
优点:

  • 避免类的重复加载(当父类加载器已经加载了,子类加载器就没有必要重复加载)。
  • 保护程序安全,防止核心API被随意篡改。

缺点:

  • 顶层的类加载器无法访问底层的类加载器所加载的类。

2.4、唯一性

虽然任意一个类的类加载器只实现类的加载动作,但是都需要通过该类的加载器类本身共同确定该类的唯一性。

2.5、应用

层次划分、OSGI、热部署、代码加密等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值