深入了解JVM——类文件结构
Posted 在咖啡里溺水的鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入了解JVM——类文件结构相关的知识,希望对你有一定的参考价值。
本文为 《深入理解Java虚拟机》第六章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。
本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。
开源创造世界
无关性的基石
Java虚拟机不和包括Java在内的任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。
我们可以这样理解:任何一门语言,只要可以按照符合JVM规范的编译出Class文件,都可以再JVM上运行。
Class类文件结构
根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。
无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,用来描述数字、索引引用、数量值或者按UTF-8编码构成字符串值。
表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯的以_info结尾。用于描述有层次关系的复合结构的数据。这个Class文件本质上就是一张表
Class文件格式
类型 | 名称 | 数量 |
---|---|---|
u4 | magic | 1 |
u2 | minor_version | 1 |
u2 | major_version | 1 |
u2 | constant_pool_count | 1 |
cp_info | constant_pool | constant_pool_count-1 |
u2 | access_flags | 1 |
u2 | this_class | 1 |
u2 | super_class | 1 |
u2 | interfaces_count | 1 |
u2 | interfaces | interfaces_count |
u2 | fields_count | 1 |
field_info | fields | fields_count |
u2 | methods_count | 1 |
method_info | methods | methods_count |
u2 | attributes_count | 1 |
attribute_info | attributes | attributes_count |
magic number 与 Class文件的版本
每个Class文件的头4个字节称为 magic number,作用是确定这个文件是否为一个能被虚拟机接受的Class文件。其值是 0xCAFEBABE
Java版本号从45开始,JDK1.1之后每个JDK大版本发布主版本号向上加1,高版本的JDK能向下兼容一起签版本的Class文件,但不能运行以后版本的Class文件。
常量池
constant_pool_count代表常量池容量计数值,计数值从1开始。0索引位置用于满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义。Class文件中只有常量池的容量计数是从1开始的。
常量池中存放字面量 Literal 和符号引用 Symbolic References。
字面量比较接近Java中规定的常量概念。符号引用属于编译原理方面的概念包括:
- 类和接口的全限定名 Fully Qualified Name
- 字段的名称和描述符 Descriptor
- 方法的名称和描述符
常量池中的每一项常量都是一个表,截止JDK1.7 共用14中不同的表结构。
类索引、父类索引与接口索引集合
this_class、super_class、interfaces用于确定类的继承关系。
字段表集合
field_info用于描述接口或类中声明的变量。不包括局部变量。
不包括父类的变量
方法表集合
method_info存储方法的描述。
不包括没有被重写的父类方法
属性表集合
attribute_info为属性表。在Class文件、字段表、方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息。
字节码指令简介
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(操作码 Opcode)以及跟随器其后的零值多个代表此操作所需参数(操作数 Operands)而构成。
以上是关于深入了解JVM——类文件结构的主要内容,如果未能解决你的问题,请参考以下文章