静态常量池&运行时常量池&字符串常量池区别_哔哩哔哩_bilibili

本文以案例拆分

硬盘中的class常量池,被加载到内存后分为 运行时常量池 和 字符串常量池。

静态常量池

+ 定义与位置: 静态常量池也称为类文件常量池,是存在于**.class** 文件(Java字节码文件)内部的一个数据结构。它是编译器在编译源代码时生成的,与具体的类或接口关联,存储了该类或接口在编译期间能确定的各类常量信息。 + 每个class文件有对应的一个 Class常量池 ,里面包含符号引用和字面量。

运行时常量池

定义与位置: 运行时常量池是JVM在运行时为每个已加载的类或接口动态创建的一个内存区域,位于方法区(Method Area)内。它是对.class文件中静态常量池内容的 runtime 实现。
  • 当class被加载后,class常量池中的内容会被加载到方法区的运行时常量池中,但是并不包含 字面量中字符型 内容。

字符串常量池

定义与位置: 字符串常量池是运行时常量池的一个子集,专门用于存储字符串字面量。在JDK 6及之前,字符串常量池位于永久代(PermGen)中;从JDK 7开始,字符串常量池被移至Java堆(Heap)。
  • 当class被加载后,class常量池字面量中的字符型内容会被加载到堆中的 字符串常量池 中。

分析Demo

1
2
3
4
5
6
7
8
public class StringDemo1 {
public static void main(String[] args) {
int i = 10000000;
String s = "abc";
Object obj = new Object();
while (true);
}
}

查看Class常量池

1.查看字节码

  • 类常量池是每个类都有的,其存在于class文件中的;

查看运行时常量池

使用HSDB来查看运行时常量池

使用jps查看当前java程序的进程号

使用HSDB查看StringDemo1的进程信息

总结:

+ 每个Class文件都有一个Class常量池;其中储存的有符号引用,这里的符号引用显示的是类型,没有地址;其中还有字面量,字面量有数值型和字符串型; + 当一个类加载后,class常量池中的内容会被加载到方法区的运行时常量池中,但是并不包含 字面量中字符型 内容。当class被加载后,class常量池字面量中的字符型内容会被加载到堆中的 字符串常量池 中。 +