Java有三种常量池,即字符串常量池(又叫全局字符串池)、class文件常量池、运行时常量池。
1. 字符串常量池(也叫全局字符串池、string pool、string literal pool)
字符串常量池 Interned Strings
2. 运行时常量池(runtime constant pool)
当程序运行到某个类时,class文件中的信息就会被解析到内存的方法区里的运行时常量池中。每个类都有一个运行时常量池
3. class文件常量池(class constant pool)
class常量池是在编译后每个class文件都有的,class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是 常量池*(constant pool table)*,用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。*字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。
4. 结论
字符串常量在堆内存,类的元数据在本地内存
文章摘自,文章写得很好