Java中的静态变量存储在哪里?

3
我想了解Java中静态变量存储在哪里。
SO上已经有一些相关问题,比如:Java中静态方法和静态变量是存储在堆内还是栈内

该链接说明静态变量存储在堆内。

但以下是Bill Veners(《Java虚拟机内部》)书中的节选:

方法区
在Java虚拟机实例中,有关已加载类型的信息存储在称为方法区的逻辑存储区域中。当Java虚拟机加载类型时,它使用类加载器来定位适当的类文件。 类加载器读入类文件--一个二进制数据流--并将其传递给虚拟机。虚拟机从二进制数据中提取有关类型的信息,并将信息存储在方法区中。在类中声明的类(静态)变量的内存也来自于方法区。

它明确说明,当加载类时,静态变量存储在方法区中。据我所知,方法区与堆不同。因此,该书与提供的SO链接存在矛盾。

请问有人能澄清这个混淆吗?


1
方法区在逻辑上是堆的一部分。 - user207421
感谢Siguza的格式化。顺便问一下,如何获取自定义ID? - Mandroid
@EJP 这应该是一个答案。 - Siguza
@SiguA 不,这只是一个针对这个琐碎问题的链接回答。 - user207421
1
这本书是错误的。方法区的本质在于它包含只读内容。 - user207421
感谢您的澄清。 - Mandroid
2个回答

1

静态变量存储在方法区的哪里? - user207421
我在 OP 引用 Bill Venners 的书中找不到任何相关内容。我的目标主要是要澄清问题的话题——方法区和堆之间的歧义。现在,我非常好奇这个规范在 JVM 中是如何表述的。 - Alain O'Dea
我怀疑你会不会。方法区的本质是它包含只读的东西,例如文本段落。 - user207421
这可能是HotSpot JVM特定的实现细节。我得重新看一下Venners的书了,已经有一段时间了。 - Alain O'Dea

0

来自JVM文档:

方法区

Java虚拟机拥有一个方法区,该区域在所有Java虚拟机线程之间共享。方法区类似于传统语言的编译代码的存储区域,或者类似于操作系统进程中的“文本”段。它存储每个类的结构,例如运行时常量池、字段和方法数据以及方法和构造函数的代码,包括用于类和实例初始化以及接口初始化的特殊方法(2.9节)。

方法区在虚拟机启动时创建。尽管方法区在逻辑上是堆的一部分,但简单的实现可能选择不对其进行垃圾回收或压缩。 Java虚拟机规范的此版本不强制执行方法区的位置或用于管理已编译代码的策略。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接