认识JVM规范

169 阅读2分钟

JVM规范作用

  • Java虚拟机规范为不同的硬件平台提供了一 种编译Java技术代码的规范
  • 该规范使Java软件独立于平台,因为编译是针对作为虚拟机的"一般机器"而做
  • 这个“一般机器”可用软件模拟并运行于各种现存的计算机系统,也可用硬件来实现

虚拟机是Java平台无关的保障

1662898202619.png

JVM规范定义的主要内容

  • 字节码指令集(相当于中央处理CPU)
  • Class文件的格式
  • 数据类型和值
  • 运行时数据区
  • 栈帧
  • 特殊方法
    • <init>: 实例初始化方法,通过JVM的invokespecial指令来调用
    • <clinit> :类或接口的初始化方法,不包含参数,返回void
  • 类库
    • Java虚拟机必须要对一些Java类库提供支持 ,否则这些类库根本无法实现,比如下面这些:
    1. 反射
    2. 加载和创建类或接口, 如ClassLoader
    3. 连接和初始化类和接口的类
    4. 安全 ,如security
    5. 多线程
    6. 弱引用
  • 异常
  • 虚拟机的启动、加载、链接和初始化

JDK与JVM官方文档

Class文件格式

  • Class文件是JVM的输入, Java虚拟机规范中定义了Class文件的结构。Class文件是JVM实现平台无关、技术无关的基础
    1. Class文件是一-组以8字节为单位的字节流,各个数据项目按顺序紧凑排列
    2. 对于占用空间大于8字节的数据项,按照高位在前的方式分割成 多个8字节进行存储
    3. Class文件格式里面只有两种类型:无符号数、表
      1. 无符号数:基本数据类型,以u1、u2、 u4、 u8来代表几个字节的无符号数
  • javap工具生成非正式的“虚拟机汇编语言”, 格式如下:<index> <opcode> [<operand1>] [<operand2>.[<comment>]
    1. <index>是指令操作码在数组中的下标,该数组以字节形式来存储 当前方法的Java虚拟机代码;也可以是相对于方法起始处的字节偏 移量
    2. <opcode>是指令的助记码、<operand> 是操作数、<comment>是行尾的注释

Class文件格式说明

  • constant .pool_ count :是从1开始的
  • 不同的常量类型,用tag来区分的,它后面对应的info结构是不一样的
  • L表示对象, [表示数组、V表示void
  • 了解预定义attribute的含义
  • stack :方法执行时,操作栈的深度
  • Locals :局部变量所需的存储空间,单位是slot(slot是虚拟机为局部变量分配内存所使用的最小单位)