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

标签 java string jvm

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

最佳答案

从技术上讲,答案都不是。根据 Java 虚拟机规范,存储字符串文字的区域在 runtime constant pool 中。 .运行时常量池内存区域是在每个类或每个接口(interface)的基础上分配的,因此它根本不依赖于任何对象实例。运行时常量池是方法区的子集,它“存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括使用的特殊方法在类和实例初始化和接口(interface)类型初始化”。 VM 规范说,虽然 方法区 在逻辑上是堆的一部分,但它并没有规定在方法区中分配的内存要进行垃圾收集或其他与正常数据相关的行为分配给堆的结构。

关于java - Java 的字符串常量池在哪里,堆还是栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4918399/

相关文章:

java - 递归删除任何没有文件的目录的方法,我的解决方案似乎有效,但试图找到它可以打破的方法

java - 将 ISO8859 字符串转换为 UTF8? ÄÖÜ => ÃÃ 为什么?

c - 从 'strings' 访问未在变量中声明的字符 (C)

java - SocketInputStream.socketRead0()中CPU占用率高的原因

java - 如何修复 java.lang.UnsupportedClassVersionError : Unsupported major. 次要版本

java - 返回第一个参数的函数有什么用?

java - 如何在 Google 应用引擎上使用 Session

java - 如何从头开始创建 RTF 编辑器(使用 Java)

java - 无法访问 Honeycomb 中的 "world readable"首选项

R:根据索引列表粘贴一些字符串向量元素