20210310--jvm类加载器子系统笔记

基本概述

   类加载器子系统负责从文件系统或者网络中加载Class文件,在加载阶段通过不同加载器,去加载对应Class,在链接阶段会验证Class中的字节流是否符合虚拟机的要求,和为类变量分配存在并默认初始化。以及为常量池中内的符合引用转化为直接引用。

类加载的三个阶段

加载阶段

     1.获取一个Class文件的二进制流,文件开头是CA FE BA BE的16进制
     2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
     3.在内存中生成一个代表这个类的大Class对象,作为方法区这个类的各种数据的访问入口

链接阶段

     1.验证:确保class文件的中字节流符合当前jvm的要求,主要有四中验证分别为文件格式验证、元数据验证、字节码验证、符号引用验证
     2.准备:为类变量分配内存并默认初始化值,比如整数为0,浮点为0.0,引用类型为null等,但不会包含fianl修饰的类变量,因为它在编译时候就已经分配了。也不会为类实例的变量分配初始化,类变量会分配在方法区中,而实例变量是随着对象的创建分配在堆中
     3.解析:将常量池内的符合引用转换为直接引用。解析动作主要针对类、接口、字段、类方法、接口方法、方法类型等

初始化阶段

   初始化的阶段就是执行类构造器方法<clinit>()的过程(该方法是jvm中定义的,只有存在static关键字时,才会执行<clinit>())
     1.构造器方法中的指令顺序也是按源文件中顺序执行
     2.当类存在父类的情况下,会先确保父类的<clinit>()执行完毕
     3.jvm会保证一个类<clinit>()方法在多线程下是同步加锁。

类加载器

   1.应用程序类加载器:java语言编写的, 该类加载是程序中默认的类加载器,java应用的类都是由它来完成,派生于ClassLoader类(间接继承),父类加载为扩展类加载器
   2.扩展类加载器:java语言编写的,派生于ClassLoader类(间接继承),父类启动类加载器。主要用于加载jdk目录下的jre/lib.ext子目录下加载类库,如果用户把jar放置该目录下也会被加载
   3.启动类加载器:用于加载java的核心库(tr.jar,resources.jar),不继承classLoader,没有父加载器
自定义类加载器是在什么时候能用到?
  自己自定义类加载器,继承ClassLoader,实现findClass方法或者继承URLClassLoader(不需要重写findClass方法)
   **作用**:
   1.隔离加载类,在开发当中使用多个框架时,可以使用隔离加载类解决jar冲突。
   2.修改类加载方式。(可以实现动态类加载,在你需要的时候去使用类加载器)
   3.扩展加载源。已有物理磁盘加载,网络传输加载,jar中,还可以扩展成如数据库、机顶盒等
   4.防止源码泄露。(源码的加密和解密)

双亲委派机制

  工作原理:
  如果一个类加载器收到了类加载请求,它不会自己先去加载,而是把请求委托给父类的加载器,去执行,当父类加载器还存在父类,则继续委托给父类,直到最顶层的启动类加载器。如果父类加载可以完成类加载任务,则成功返回,倘若父类加载无法完成,此时子类加载器才会去尝试去加载,这就是双亲委派模式。
  优势:避免类的重复加载,保护程序安全,防止核心api被随意篡改。

总结

  类加载器子系统在jvm承担着class源文件转换、验证、初始化这样的一个过程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值