2015-06-27 54 views
2

我想知道在Java中存储静态变量的位置。
已经有如此之少的问题,比如: where is a static method and a static variable stored in java. In heap or in stack memory哪里存储在Java中的静态变量?

链接指出静态变量保存在堆上。

但以下是从一本书比尔Veners一间摘录(“深入Java虚拟机”):

方法区
里面一个Java虚拟机实例,约装载类型的信息存储在 内存的逻辑区域调用方法区域。当Java虚拟机加载一个类型时,它会使用一个类加载器来寻找合适的类文件到 。类加载器读入类文件 - 二进制数据的线性流 - 并将其传递给虚拟机。虚拟机从 二进制数据中提取关于类型的信息,并将信息存储在方法区域中。在 中声明的类(静态)变量的内存也从方法区域中获取。

它明确指出,当加载一个类时,静态变量存储在方法区域中。就我所知,方法区域与堆不同。所以这本书与提供的SO链接相矛盾。

有人可以澄清混淆?

+1

[方法区在逻辑上是堆的一部分。](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2。html#jvms-2.5.4) – EJP

+0

感谢Siguza的格式化。顺便说一句,如何获得定制的ID? – Mandroid

+0

@EJP这应该是一个答案。 – Siguza

回答

0

从JVM文件建立:

方法区

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

方法区域在虚拟机启动时创建。 尽管方法区域在逻辑上是堆的一部分,但是简单的实现可以选择不垃圾收集或压缩它。此版本的Java虚拟机规范并未强制使用方法区域的位置或用于管理编译代码的策略。

1

在JVM内存模型中,静态变量的引用和值都存储在本身位于堆中的方法区域中。

方法区域是在虚拟机启动时创建的。虽然方法区域在逻辑上是堆的一部分,但是简单的实现可以选择不垃圾收集或压缩它。

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.4

+0

它说静态变量在方法区域? – EJP

+0

它不在我能从比尔·威纳斯的书中得到的报价之外找到的任何地方。我主要是试图澄清关于方法区域和堆的歧义,这是问题的主题,现在我非常好奇在JVM规范中找到它。 –

+0

我怀疑你会。方法区域的本质是它包含只读内容,如文本段。 – EJP