Java的字符串常量池在哪里,堆还是堆栈?

我知道常量池和JVM用来处理字符串文本的字符串常量池的概念。但是我不知道JVM使用哪种类型的内存来存储字符串常量文本。堆栈还是堆?因为它是一个与任何实例都不相关的文本,所以我假设它将存储在堆栈中。但是,如果它没有被任何实例引用,则必须由GC-run收集文本(如果我错了,请纠正我),那么如果它存储在堆栈中,该如何处理呢

从技术上来说,答案是两者都不是。根据Java虚拟机规范,存储字符串文本的区域位于运行时常量池中。运行时常量池内存区域是基于每个类或每个接口分配的,因此它根本不绑定到任何对象实例。运行时常量池是方法区域的子集,它“存储每类结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口类型初始化中使用的特殊方法”。VM规范指出,尽管方法区域在逻辑上是堆的一部分,但它并不规定在方法区域中分配的内存会受到垃圾收集或与分配给堆的正常数据结构相关的其他行为的影响

发表评论