主题
面试速答(先看这里)
**一句话结论:**运行时常量池,是runtime constant pool,是Java虚拟机规范中定义的一块逻辑区域,它是方法区的一部分,规范中说明了,它是用于存储常量、符号引用和一些编译期已知的常量数据。
60秒标准回答:
运行时常量池,是runtime constant pool,是Java虚拟机规范中定义的一块逻辑区域,它是方法区的一部分,规范中说明了,它是用于存储常量、符号引用和一些编译期已知的常量数据
因为Java虚拟机规范并没有规定要如何实现方法区,所以在不同的HotSpot的JDK版本中,方法区所处的位置是不同的,所以运行时常量池所处的位置也是不一样的
Java虚拟机规范中还说,字符串字面量不应该重复的存储在运行时常量池中,应该做到可以复用
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**因为Java虚拟机规范并没有规定要如何实现方法区,所以在不同的HotSpot的JDK版本中,方法区所处的位置是不同的,所以运行时常量池所处的位置也是不一样的。
- **要点2:**Java虚拟机规范中还说,字符串字面量不应该重复的存储在运行时常量池中,应该做到可以复用。
- **要点3:**但是,以上都是规范,并不是具体实现,而字符串常量池这个东西,就是HotSpot的一种具体实现。
- **要点4:**HotSpot为了复用字符串对象,定义了一个字符串常量池,它是作为字符串对象的缓存池,用于存储所有字面量形式创建的字符串。
- **要点5:**很多人认为字符串常量池和运行时常量池没啥关系,因为他们所处的位置不一样,尤其是在JDK 1.7之后,字符串常量池在堆上,而运行时常量池随着方法区而处于永久代或者元空间。
**记忆锚点:**HotSpot → Java → JDK → 运行时常量池随着方法 → 为了复用字符串对象 → 它是作为字符串对象
追问准备:
- 围绕「HotSpot」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Java」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「JDK」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
运行时常量池,是runtime constant pool,是Java虚拟机规范中定义的一块逻辑区域,它是方法区的一部分,规范中说明了,它是用于存储常量、符号引用和一些编译期已知的常量数据。
因为Java虚拟机规范并没有规定要如何实现方法区,所以在不同的HotSpot的JDK版本中,方法区所处的位置是不同的,所以运行时常量池所处的位置也是不一样的。
Java虚拟机规范中还说,字符串字面量不应该重复的存储在运行时常量池中,应该做到可以复用。
但是,以上都是规范,并不是具体实现,而字符串常量池这个东西,就是HotSpot的一种具体实现。
HotSpot为了复用字符串对象,定义了一个字符串常量池,它是作为字符串对象的缓存池,用于存储所有字面量形式创建的字符串。
很多人认为字符串常量池和运行时常量池没啥关系,因为他们所处的位置不一样,尤其是在JDK 1.7之后,字符串常量池在堆上,而运行时常量池随着方法区而处于永久代或者元空间。
但是,根据虚拟机规范,字符串常量,需要放在运行时常量池中。所以,我认为字符串池就是运行时常量池的一个逻辑子区域。即字符串池是运行时常量池的分池!