✅运行时常量池和字符串常量池的关系是什么?

典型回答

运行时常量池,是runtime constant pool,是Java虚拟机规范中定义的一块逻辑区域,它是方法区的一部分,规范中说明了,它是用于存储常量、符号引用和一些编译期已知的常量数据。

因为Java虚拟机规范并没有规定要如何实现方法区,所以在不同的HotSpot的JDK版本中,方法区所处的位置是不同的,所以运行时常量池所处的位置也是不一样的。

✅什么是方法区?是如何实现的?

Java虚拟机规范中还说,字符串字面量不应该重复的存储在运行时常量池中,应该做到可以复用。

但是,以上都是规范,并不是具体实现,而字符串常量池这个东西,就是HotSpot的一种具体实现。

HotSpot为了复用字符串对象,定义了一个字符串常量池,它是作为字符串对象的缓存池,用于存储所有字面量形式创建的字符串。

很多人认为字符串常量池和运行时常量池没啥关系,因为他们所处的位置不一样,尤其是在JDK 1.7之后,字符串常量池在堆上,而运行时常量池随着方法区而处于永久代或者元空间。

但是,根据虚拟机规范,字符串常量,需要放在运行时常量池中。所以,我认为字符串池就是运行时常量池的一个逻辑子区域。即字符串池是运行时常量池的分池!

原文: https://www.yuque.com/hollis666/xkm7k3/qbaa4627yid4v1em