JVM(一):Class文件格式

简介: JVM(一):Class文件格式

Class类文件结构

  • Class 文件是一组以 8 字节为基础单位的二进制流
  • 各个数据项目严格按照顺序紧凑排列在 class 文件中
  • 中间没有分隔符,这使得 class 文件中存储的内容几乎是全部程序运行的程序

包括两种类型:无符号数

无符号数

  • 属于基本数据类型
  • 按照 UTF-8 编码构成的字符串,大小使用 u1/u2/u4/u8 表示1字节、2字节、4字节、8字节

在class文件中,主要分为魔数Class文件的版本号常量池访问标志类索引(还包括父类索引和接口索引集合)、字段表集合方法表集合属性表集合

魔数

  • 每个 Class 的文件头的4个字节成为魔数 (Magic Number
  • 唯一作用是用于确定这个文件是否为一个能被虚拟机接受的 Class 文件
  • Class 文件魔数的值为 0xCAFEBABE。如果一个文件不是以 0xCAFEBABE 开头,那么他肯定就不是 Java class 文件
    Class文件的版本号
  • 次版本号(minor version):前 2 字节用于表示次版本号
  • 主版本号(major version):后 2 字节用于表示主版本号
    对应着 JDK 的版本号

常量池

常量池 简单理解为 class 文件的资源从库

  • 常量池容量计数值(constant pool count):常量的数量
  • 数据集合 (constant_pool): 数量 = constant pool count - 1
  • 字面量:文本字符串、被声明为final的常量值
  • 符号引用
  • 类和接口的全限定名
  • 字段的名称和描述符
  • 方法的名称和描述符

访问标志

主要用于识别一些类或接口层次访问信息

  • 是否 final
  • 是否 pubIicprivate
  • 是否是接口
  • 是否是 abstact
  • 是否是注解
  • 是否是枚举

类索引、父类索引、接口索引集合

确定类的继承关系

  • 类索引(this_class):用于确定这个类的全限定名,占2字节
  • 父类索引(super_class):用于确定这个类父类的全限定名【不允许多重继承】
  • 接口索引计数器(interfaces_count): 如果该类没有实现接口,则该数字为 0
  • 接口索引集合 (interfaces): 实现的哪些接口

字段表集合

  • 字段表计数器(fields_count): 字段表数据个数
  • 字段表集合(fields): 描述声明的变量
  • publicprotectedprivate
  • static
  • final
  • volatile

方法表集合

  • 方法表计数器(methods_count): 方法数据个数
  • 方法表集合(methods): 表示方法的集合

属性表集合

属性表集合不要求其中包含的属性表具有严格的顺序,并且只要属性的名称不与已有的属性名称重复,任何人实现的编译器可以向属性表中写入自己定义的属性信息。


相关文章
|
安全 Java
对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解
对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解
163 0
|
10月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
870 55
|
8月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
226 0
|
11月前
|
Arthas 监控 Java
Arthas redefine(加载外部的.class文件,redefine到JVM里 )
Arthas redefine(加载外部的.class文件,redefine到JVM里 )
549 15
|
10月前
|
Arthas 存储 Java
JVM深入原理(三+四):JVM组成和JVM字节码文件
目录3. JVM组成3.1. 组成-运行时数据区3.2. 组成-类加载器3.3. 组成-执行引擎3.4. 组成-本地接口4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas
181 0
|
10月前
|
存储 安全 Java
JVM深入原理(五):JVM组成和JVM字节码文件
类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析。
150 0
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
227 3
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
360 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
Java
jmap 查看jvm内存大小并进行dump文件内存分析
jmap 查看jvm内存大小并进行dump文件内存分析
745 3
|
Java 索引
【JVM】字节码文件的组成部分
【JVM】字节码文件的组成部分
174 1