JVM常量池分类与区别
请说明Class常量池、运行时常量池和字符串常量池(String Pool)之间的区别与联系。
回答
我还是少年
1. Class常量池
- 存在于Class文件中,存储字面量(字符串、final常量)和符号引用(类名、方法名、字段名等)。
- 每个类对应一个Class常量池。
2. 运行时常量池
- 类加载后将Class常量池的符号引用解析为直接引用,放入方法区的运行时常量池。
- JDK7之前位于方法区(永久代),JDK7后位于堆。
3. 字符串常量池(String Pool)
- 存储字符串字面量的引用(实际String对象可在堆上)。
- JDK6在永久代,JDK7后移至堆。
String s = "abc":从String Pool获取,若不存在则创建。String s = new String("abc"):堆中创建对象,但"abc"字面量仍在String Pool中。- intern()方法:将字符串放入String Pool并返回池中的引用。
关键区别:运行时常量池是方法区的一部分,包含类加载后的所有常量;String Pool是运行时常量池中字符串字面量的专用哈希表。