类加载子系统

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

类加载器子系统作用

  1. 类加载器子系统负责从文件系统或者网络中加载Class文件class文件在文件开头有特定的文件标识。
  2. ClassLoader只负责class文件的加载至于它是否可以运行则由Execution Engine决定。
  3. 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外方法区中还会存放运行时常量池信息可能还包括字符串字面量和数字常量这部分常量信息是Class文件中常量池部分的内存映射

类加载过程

  • 执行 main() 方法静态方法就需要先加载main方法所在类 HelloLoader
  • 加载成功则进行链接、初始化等操作。完成后调用 HelloLoader 类中的静态方法 main
  • 加载失败则抛出异常

加载阶段

加载

  1. 通过一个类的全限定名获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个类的各种数据的访问入口

加载class文件的方式

  1. 从本地系统中直接加载
  2. 通过网络获取典型场景Web Applet
  3. 从zip压缩包中读取成为日后jar、war格式的基础
  4. 运行时计算生成使用最多的是动态代理技术
  5. 由其他文件生成典型场景JSP应用从专有数据库中提取.class文件比较少见
  6. 从加密文件中获取典型的防Class文件被反编译的保护措施

链接阶段

链接分为三个子阶段验证 -> 准备 -> 解析

验证(Verify)

  1. 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求保证被加载类的正确性不会危害虚拟机自身安全
  2. 主要包括四种验证文件格式验证元数据验证字节码验证符号引用验证。

举例

使用 BinaryViewer软件查看字节码文件其开头均为 CAFE BABE 如果出现不合法的字节码文件那么将会验证不通过。

准备(Prepare)

  1. 为类变量static变量分配内存并且设置该类变量的默认初始值即零值

  2. 这里不包含用final修饰的static因为final在编译的时候就会分配好了默认值准备阶段会显式初始化

  3. 注意这里不会为实例变量分配初始化类变量会分配在方法区中而实例变量是会随着对象一起分配到Java堆中

  4. 解析(Resolve)

  5. 将常量池内的符号引用转换为直接引用的过程

  6. 事实上解析操作往往会伴随着JVM在执行完初始化之后再执行

  7. 符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《java虚拟机规范》的class文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄

  8. 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT Class info、CONSTANT Fieldref info、CONSTANT Methodref info等

符号引用

  • 反编译 class 文件后可以查看符号引用下面带# 的就是符号引用
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6