静态变量存储在java中的哪个位置?

时间:2015-06-27 18:16:52

标签: java static jvm

我想知道Java中存储静态变量的位置 关于SO的问题已经很少了,例如: where is a static method and a static variable stored in java. In heap or in stack memory

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

但以下是Bill Veners(" Java虚拟机内部")中的一本书的摘录:

  

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

它清楚地表明,当加载类时,静态变量存储在方法区域中。据我所知,方法区域与堆不同。所以这本书与提供的SO链接相矛盾。

有人可以澄清一下这种困惑吗?

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:0)

来自JVM Documentaion:

  

方法区

     

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

     

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