CodeWalk

JVM常量池分类与区别

作者:我还是少年 · 2026-05-30 12:55

请说明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是运行时常量池中字符串字面量的专用哈希表。