java - 字符串变量名是否存储在堆栈中?就像数组名称存储在堆栈中,但其内容存储在堆中一样。

标签 java string

String abc = "dog";

字符串变量名(即 abc)是否在堆中存储一个位置,而其本身则像数组一样存储在堆栈中?还是字符串的工作方式不同?

最佳答案

关于名称 abc:

如果该代码位于方法中,则名称 abc 不会存储在任何地方。它只是一个由索引引用的堆栈变量。

如果该代码位于类级别,则它定义一个实例变量,因此其名称存储在字节码中。

你可以使用javap -c ClassName来查看类的字节码,当然,你也可以通过你喜欢的方式查看.class文件的内容二进制文件查看器(或者如果您喜欢老式的,hexdump -C filename)。

重新获取字符串的值

字符串的值与所有对象的值一样,存储在堆中(概念上,请参阅 * 了解更多)。字符串文字和其他字符串编译时常量(例如代码中的“dog”)存储在 the constant pool 中。类(这是 .class 格式的一部分)。当加载类时,这些字符串常量是 interned放入当前运行的 JVM 的字符串实习池中。字符串实习池位于堆上。

重新引用字符串

如果该代码位于方法中,则对字符串池中字符串的引用将存储在堆栈上。

如果该代码位于类级别,则引用将存储在实例变量的存储中,该存储是实例变量所属对象的一部分。从概念上讲,该对象位于堆上。*

<小时/>

*“概念上在堆上”

Oracle的JVM非常聪明。在方法内,本地创建的对象很可能分配在堆栈上而不是堆上,作为性能优化,因为在离开方法时重置堆栈指针比释放堆内存更简单、更快。但是,如果对该对象的引用在方法终止后仍然存在,则该对象将从堆栈复制到堆,因为当然,作为从方法退出过程的一部分,堆栈将被弹出。 JVM 决定是否这样做是基于多种因素,尤其是相关方法是否处于代码中值得优化的“热点”。

但这是 JVM 中的性能优化。从概念上讲,对象是在堆上分配的。

关于java - 字符串变量名是否存储在堆栈中?就像数组名称存储在堆栈中,但其内容存储在堆中一样。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43719146/

相关文章:

c++ - 如何获取字符串数组的字符串长度?

java - JAVA将一个字符串分割成3个字符串,每个字符串都有自己的分隔符

Java-8 - 从 Optional.of(String) 的开头替换 "?"字符

python - 如何检查列表中的所有字符串?

java - PBKDF2WithHmacSHA512 对比。 PBKDF2WithHmacSHA1

Java正则表达式匹配多行

java - 外部化最终实例变量

c++ - 为什么不打印 char 数组的单元化索引?

java - 如何确保方法上存在 @Scheduled 注释

java - 创建另一个进程的 HWND 的子窗口? (例如屏保预览)