快捷搜索:

KVM的常量池

在class文件中,“常量池”是最繁杂也最值得关注的内容。

Java是一种动态连接的说话,常量池的感化异常紧张,常量池中除了包孕代码中所定义的各类基础类型(如int、long等等)和工具型(如String及数组)的常量值还,还包孕一些以文本形式呈现的符号引用,比如:

类和接口的全限制名;

字段的名称和描述符;

措施和名称和描述符。

在C说话中,假如一个法度榜样要调用其它库中的函数,在连接时,该函数在库中的位置(即相对付库文件开首的偏移量)会被写在法度榜样中,在运行时,直接去这个地址调用函数;

而在Java说话中不是这样,统统都是动态的。编译时,假如发明对其它类措施的调用或者对其它类字段的引用的话,记录进class文件中的,只能是一个文本形式的符号引用,在连接历程中,虚拟机根据这个文本信息去查找对应的措施或字段。

以是,与Java说话中的所谓“常量”不合,class文件中的“常量”内容很非富,这些常量集中在class中的一个区域寄放,一个紧接着一个,这里就称为“常量池”。

常量池由多条“常量池项”组成,每一个常量池项又由两部分组成,这里分手称为“常量池项头”和“常量池项体”。

常量池项头注解常量池项的类型,常量池项共分为11种类型,分手为:

常量池项类型

阐明

CONSTANT_Utf8

1

UTF-8编码的Unicode字符串

CONSTANT_Integer

3

int型常量

CONSTANT_Float

4

Float型常量

CONSTANT_Long

5

Long型常量

CONSTANT_Double

6

double型常量

CONSTANT_Class

7

对一个class的符号引用

CONSTANT_String

8

String型常量

CONSTANT_Fieldref

9

对一个字段的符号引用

CONSTANT_Methodref

10

对一个类措施的符号引用

CONSTANT_InterfaceMedthodref

11

对一个接口措施的符号引用

CONSTANT_NameAndType

12

对名称和类型的符号引用

常量池项体中寄放的便是对应的常量数据,比如各类数值型的常量或者字符串等等。

以下先容kvm中的常量池是若何组织起来的。

数据布局:

在KVM的头文件kvm/vmcommon/h/pool.h中,有以下对常量池项类型的定义:

#define CONSTANT_Utf81

#define CONSTANT_Integer3

#define CONSTANT_Float4

#define CONSTANT_Long5

#define CONSTANT_Double6

#define CONSTANT_Class7

#define CONSTANT_String8

#define CONSTANT_Fieldref9

#define CONSTANT_Methodref10

#define CONSTANT_InterfaceMethodref11

#define CONSTANT_NameAndType12

您可能还会对下面的文章感兴趣: