JVM类文件结构
2017-10-28 本文已影响0人
疯狂的哈丘
JVM的类文件通俗讲就是编译后的class文件。由于文件名是可以任意更改的,所以我们不能说以.class为后缀的文件就是JVM的类文件。
JVM类文件的结构(二进制字节码文件)必须严格遵守JVM定下的规范。因此,只要字节码文件符合这个规范,不论这个字节码文件叫什么名字,放在哪里(磁盘还是网络传输或者其他方式生成),JVM都可以识别执行。
所以并不是只有编译java源码才可以得到JVM类文件,只要你有编译器,可以将任何语言编译成符合JVM规范的类文件。
JVM类文件结构
- JVM前面4个字节必须是0xCAFEBABE,又称魔数。用来标识该文件是否是JVM类文件。
- JVM类文件是没有分隔符的,各个数据紧凑排列
- 大小使用u1、u2、u4、u8分别表示1字节、2字节、4字节和8字节
- 书上和网上很多地方都说是以是一组以8字节为基础单位的二进制流,但是按我理解应该是以一个字节为基础单位,即8个bit为基础单位。
各个数据的具体顺序如下图:

各个数据块具体的介绍书上和网上都讲的很详细了,这里就不介绍了。
类文件常量池
以前一直很不理解常量池的概念。今天看了JVM的类文件结构这一张,对常量池终于有了个清晰的了解。
每个JVM类文件都有一个自己的常量池,存放类的类名,变量名,字符串,方法名等。我们可以通过索引得到这些描述。
这里注意一点,常量池表的下标是从1开始的。其他表都是从0开始。常量池表把下标0空出来是为了让满足后面某些指向常量池的索引值的数据在特定的情况下需要表达"不引用任何一个常量池项目"的含义。
字节码指令集
- JVM字节码是由1个字节长度的操作码和零个或多个参数构成的(成为操作数)。
- 由于操作码只占1个字节,所以JVM指令集不会超过256个(每个数字都代表某种操作)。目前JVM指令集已经有200多个了。
- 大多数指令都没有操作数,需要有操作数的指令它的操作数都会紧随其后。
类文件结构详解:
http://blog.csdn.net/ochangwen/article/details/51457398