JVM-常量池

JVM中的常量池通常是对静态常量池字符串常量池运行时常量池的总称

静态常量池

存在于.class文件中,存放类的版本、字段、方法、接口的信息,同时还存放俩大常量:字面量(如字符串、申明为final类型的值)、符号引用,这部分将在类加载后进入方法区的运行时常量池存放。

符号引用包括:类和接口的全限定名、字段名称和描述符、方法名称和描述符

字面量包括:字符串、final修饰的常量、基本数据类型数值、其它

名词解释:

字面量:java代码在编译过程中是无法构建引用的,字面量就是在编译时对于数据的一种表示。int i = 1;//1便是字面量

符号引用:由于在编译过程中并不知道每个类的地址,因为可能这个类还没有加载,所以如果你在一个类中引用了另一个类,那么你完全无法知道他的内存地址,那怎么办,我们只能用他的类名作为符号引用,在类加载完后用这个符号引用去获取他的内存地址。

总结下就是:静态常量池即是存在于.class文件中的的常量池,即编译时期

运行时常量池

JVM在完成类的加载之后,将class文件中的常量池放入方法区(1.8元空间),其中包括静态常量池中的字面量和符号引用。其中符号引用替换成直接引用(就是地址值)

其中8种基本类型的包装类中有6种会存放在常量池种。那就是Byte、Boolean、Short、Integer、Long、Character。Double和Float暂时没有实现,但这6种类型的取值范围也仅限于-128-127

运行时常量池相对于class文件常量池(即静态常量池)的另外一个特性是具备动态性,java语言并不要求常量一定只有编译器才产生,也就是并非预置入class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中。例如String的intern()方法。

字符串常量池

静态常量池中的字符串在类加载完成后会存放字符串常量池中,JDK1.7之前,字符串常量池存在于方法区,1.7迁移到堆中。同时迁入到堆的还有静态变量。1.8方法区改朝换代为元空间

.java文件编译过程

Q.E.D.


一个热爱生活的95后精神小伙