常量池的表现方式 一.class文件中常量池的表现方式 下面有这样一个类 public class Act { public long m1 () { int a = 4 ; long b = 444 ; return a + b ; } } 将Act类编译成Act.class文件,使用16进制查看器打开
常量池的表现方式
一.class文件中常量池的表现方式
下面有这样一个类
public long m1() {
int a=4;
long b=444;
return a+b;
}
}
将Act类编译成Act.class文件,使用16进制查看器打开
依次类推,不同的常量池标志,用不同的数字表示,下表列出了Class文件中常量池所有的标志
类型(tag)
值
UTF8
1
Integer
3
Float
4
Long
5
Double
6
Class
7
String
8
Fieldref
9
Methodref
10
InterfaceMethodref
11
NameAndType
12
这个表虽然列出了常量池信息,但是我个人觉得它不重要,我主要想表达的是:在Class文件中,常量池是连续的
二:内存中常量池的表现方式
JVM读取class文件的常量池信息,会根据这些信息,最终组织到内存中,那么在内存中,常量池是什么样子的呢?JVM规范并没有规定内存中常量池是什么样子,不过下面这个样子是最合理的
所以常量池在内存中的表现,有点像旧时的HashMap,左侧红色虚线是一个数组,数组中每个元素大小是jvm中的一个字(4字节),注意long和double会占用两个元素,如果一个元素的内容不是字面值,而是引用值的话,那么右侧黄色虚线中,是具体每个元素的内容