前言
在JDK7之前,字符串常量是存在永久带Perm 区的,JDK7开始在将常量池迁移到堆中,这个变化也导致了String的新特性,接下来,我们按照jdk7开始后的版本进行介绍。
JdK1.7之前
Jdk1.7开始
一.常量池共有三类:
1.运行时常量池
2.Class文件常量池
3.字符串常量池
二. 详解
- 常量池(Constant Pool)
1.1 常量池(Class文件常量池):.java经过编译后生成的.class文件,是Class文件的资源仓库。
1.2 常量池中主要存放俩大常量:字面量(文本字符串,final常量)和符号引用(类和接口的全局定名,字段的名称和描述,方法的名称和描述),如下图:
2. 运行时常量池(Constant Pool)
运行时常量池是方法区的一部分。在Class常量池中,用于存放编译期间生成的字面量和符号量,在类加载完之后,存入运行时常量池中。而运行时常量池期间也有可能加入新的常量(如:String.intern方法)
3. String常量池,
String常量池,JVM为了减少字符串对象的重复创建,在堆区开一段内存存放字符串。