07-进阶技术—类加载


前言

java代码在编译后生成的字节码文件,是由类加载器“搬进”JVM中
在这里插入图片描述


一、类加载器

  • 类加载器的作用
    负责将.class文件(存储的物理文件)加载在到内存中
    在这里插入图片描述
  • 注意
    进行类加载时,加载.class文件到内存中会随之生成对应的java.lang.Class对象

二、类加载的过程

  • 介绍
    在这里插入图片描述
  • 类加载过程图解
    • 加载
      • 通过包名 + 类名,获取这个类,准备用流进行传输
      • 在这个类加载到内存中
      • 加载完毕创建一个class对象
        在这里插入图片描述
    • 链接
      • 验证
        确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全
        (文件中的信息是否符合虚拟机规范有没有安全隐患)
        在这里插入图片描述
    • 准备
      负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值
      (初始化静态变量)
      在这里插入图片描述
    • 解析
      将类的二进制数据流中的符号引用替换为直接引用
      (本类中如果用到了其他类,此时就需要找到对应的类)
      在这里插入图片描述
    • 初始化
      根据程序员通过程序制定的主观计划去初始化类变量和其他资源
      (静态变量赋值以及初始化其他资源)在这里插入图片描述

因此JVM会总是先初始化java.lang下的Object类

在这里插入图片描述

  • 小结
    • 当一个类被使用的时候,才会加载到内存
    • 类加载的过程: 加载、验证、准备、解析、初始化

三、类加载的分类

  • 分类
    • 根类加载器:Bootstrap class loader ——> null
      也叫虚拟机的内置类加载器,通常表示为null,并且没有父null
    • 扩展类加载器( Extension ):Platform class loader ——> ExtClassLoader
      也叫平台类加载器,负责加载JDK中一些特殊的模块
    • 系统类加载器:System class loader ——> AppClassLoader
      也是应用类加载器,负责加载用户类路径上所指定的类库

  • 类加载器的继承关系
    • System的父加载器为Platform
    • Platform的父加载器为Bootstrap
      在这里插入图片描述
  • 代码演示

    public class ClassLoaderDemo1 {
        public static void main(String[] args) {
            //获取系统类加载器
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
    
            //获取系统类加载器的父加载器 --- 平台类加载器
            ClassLoader classLoader1 = systemClassLoader.getParent();
    
            //获取平台类加载器的父加载器 --- 启动类加载器
            ClassLoader classLoader2 = classLoader1.getParent();
    
            System.out.println("系统类加载器" + systemClassLoader);
            System.out.println("平台类加载器" + classLoader1);
            System.out.println("启动类加载器" + classLoader2);
    
        }
    }
    

四、双亲委派模型

  • JVM的加载机制
    • 全盘负责
      就是当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除
      非显示使用另外一个类加载器来载入
    • 双亲委派
      就是当一个类加载器负责加载某个Class时,先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
    • 缓存机制
      保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象时,类加载器先从缓存区中搜索该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存储到缓存区

  • 双亲委派模型介绍在这里插入图片描述
  • 双亲委派模型图解
    在这里插入图片描述
  • 双亲委派模型的步骤
    • 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
    • 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器
    • 如果父类加载器可以完成类加载任务,就成功返回
    • 倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式

  • 使用双亲委派机制的好处
    • 可以避免类的重复加载,当父类加载器已经加载了该类时,就没有必要子ClassLoader再加载一次
    • 考虑到安全因素,java核心api中定义类型不会被随意替换
      假设通过网络传递一个名为java.lang.Object的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心ava APl发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的iava.lang.0bject,而直接返回已加载过的Obiect.cass,这样便可以防止核心API库被随意算改
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值