常量池_运行时常量池_字符串常量池

发布时间 2023-12-12 16:48:24作者: anpeiyong

常量池

常量池是在编译期间由 Java 编译器生成的一个数据结构

存储了 类或接口中的所有字面量和符号引用

这些信息包括但不限于:

  • 字符串字面量
  • 整型、浮点型、字符型等基本类型的字面量
  • 类和接口的全限定名
  • 字段名和描述符
  • 方法名和描述符
  • 方法和字段的访问标志

每个类文件都包含一个常量池,它是 class 文件的一部分。

当 JVM 加载类时,会将这个常量池的内容复制到方法区中的运行时常量池中;

 

运行时常量池

方法区的一部分,它包含了类或接口的常量池以及其他运行时产生的常量。

运行时常量池是在类加载过程中由 JVM 创建的,它的内容来自于类文件中的常量池。

作用:

  提供了一种机制来查找和解析符号引用,并将它们转换为直接引用。这个过程通常被称为“动态链接”。

需要注意的是,运行时常量池不仅仅包含从类文件常量池复制过来的信息,还可能包含其他运行时生成的常量,例如动态代理类的元数据

 

 

字符串常量池

字符串常量池是一个特殊的区域;

用于存储字符串对象的引用

当创建一个新的字符串对象时,JVM 会检查字符串常量池中是否已经存在相同的字符串。如果存在,那么就直接返回该字符串的引用;否则,创建一个新的字符串对象并将其引用存入字符串常量池。

在 Java 7 及之前版本中,字符串常量池位于永久代(PermGen),而在 Java 8 及之后版本中,字符串常量池被移动到了堆内存中;

 

查看当前进程的大小:

  jinfo -flag StringTableSize 进程ID