JVM学习2: 类加载器基础 上

JVM简图

在这里插入图片描述

在这里插入图片描述

类加载器子系统

在这里插入图片描述

负责从文件系统或网络加载class文件,class文件在文件开始有特定的标识。

ClassLoader只负责class文件加载,至于是否可以运行,则由Execution Engine决定。

加载的类信息存放在一个称为方法区的内存空间,除了类信息,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量。

类的加载过程

加载

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

加载.class文件的方式

  • 本地文件系统
  • 网络
  • zip包,比如jar和war
  • 运行时生成,动态代理
  • 由其他类型文件生成,比如JSP
  • 数据库
  • 加密文件,防反编译

链接

验证

  • 确保Class文件的字节流包含的信息符合当前虚拟机要求,保证被加载的类的正确性,不会危害虚拟机安全。
  • 文件格式验证、元数据验证、字节码验证、符号引用验证。

准备

  • 为类变量分配内存并且设置该类变量的默认初始值。
  • 不包含final变量,因为final变量在编译时就分配了,准备阶段会显示初始化。
  • 不会为实例变量分配内存,因为这些实例变量会随着对象创建分配到堆中。

解析

  • 将常量池内的符号引用转为直接引用。
  • 解析操作往往伴随JVM在执行完初始化之后再执行。
  • 符号引用就是一组符号来描述所引用的目标。
  • 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等,对应常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。

初始化

  • 执行类的<clinit>()方法,里面的指令按语句在源文件中的顺序执行。
  • <clinit>()方法与构造器不同。
  • 若有父类,JVM会保证子类的<clinit>()方法执行前,父类的<clinit>()方法已经执行完毕。
  • 虚拟机必须保证<clinit>()方法在多线程下同步执行。

工具软件

  • jclasslib bytecode
  • binary viewer
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值