JVM学习笔记day2

类的加载

  • 类的加载的最终产品是位于内存中的Class对象

  • Class对象封装了类在方法区内的数据结构,并且将Java程序员提供了访问方法区内的数据结构的接口

  • 有两种类型的类加载器

    • Java虚拟机自带的加载器
      • 根类加载器(Bootstrap)
      • 扩展类加载器(Extension)
      • 系统(应用)类加载器(System)
    • 用户自定义的类加载器
      • java.lang.Classloader的子类
      • 用户可以定制类的加载方式
  • 类加载器并不需要等到某个类被"首次主动使用"时再加载它

  • JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)

  • 如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误

类的验证

  • 类被加载后,就进入连接阶段。连接就是将已经读入内存的类的二进制数据合并至虚拟机的运行时环境中去
  • 类的验证的内容
    • 类文件的结构检查
    • 语义检查
    • 字节码验证
    • 二进制兼容性的验证
  • 类加载器用来把类加载到java虚拟机中,从JDK1.2版本开始,类的加载过程采用父亲委托机智,这种机制能更好地保证Java平台的安全,在此委托机制中,除了Java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器,当Java程序请求加载器loader加载Sample类时,loader首先委托自己的父加载器去加载Sample类,若父加载器能加载,则由父加载器完成加载任务,否则才由加载器loader本身加载Sample类。
  • Java虚拟机自带了以下几种加载器
    • 根(Bootstrap)类加载器: 该加载器没有父加载器,它负责加载虚拟机的核心类库,如java.lang.*等。例如java.lang.Object就是由根类加载器加载的,根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。根类加载器的实现依赖于底层操作系统,属于虚拟机的实现的一部分,它并没有继承java.lang.ClassLoader类。
    • 扩展(Extension)类加载器:它的父加载器为根类加载器。它从java.ext.dirs系统属性所指定的目录中加载类库,或者从JDK的安装目录的jre\lib\ext子目录(拓展目录)下加载类库,如果把用户创建的JAR文件放在这目录下,也会自动由扩展类加载器加载。扩展类加载器是纯Java类,是java.lang.ClassLoader类的子类
    • 系统(System)类加载器:也称为应用类加载器,它的父加载器为扩展类加载器,它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,它是用户自定义的类加载器的默认父加载器。系统类加载器是纯Java类,是java.lang.ClassLoader类的子类。
  • 除了以上虚拟机自带的加载器外,用户还可以定制自己的类加载器。Java提供了抽象类java.lang.ClassLoader,所有用户自定义的类加载器都应该继承ClassLoader类
  • 类加载器的父亲委托机制
    • 在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类架子器都有且只有一个父加载器
      在这里插入图片描述

如图所示: 在加载一个类时不会用它本身的加载器而是委托父类加载器加载,而父类加载器又委托它的父类加载器直至委托至根类加载器(没有父类)才开始对类进行加载,当加载器无法加载所要加载的类时,则用其子加载器进行加载。这就是双亲委托加载机制。

  • Bootstrap ClassLoader/启动类加载器

    • $JAVA_HOME中jre/lib/rt.jar里所有的class,由c++实现,不是ClassLoader子类
  • Extension ClassLoader/扩展类加载器

    • 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
  • App ClassLoader/系统类加载器

    • 负责加载classpath中指定的jar包及目录中的class
  • 若有一个类加载器能够成功加载Test类,那么这个类加载器被称为定义类加载器,所有能成功返回Class对象引用的类加载器(包括定义类加载器)都被称为初始类加载器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值