我想知道静态变量在哪里存储在Java中。
关于这样的问题已经很少了,比如:where is a static method and a static variable stored in java. In heap or in stack memory
链接声明静态变量存储在堆中。
但以下是Bill Veners (“Java虚拟机内部”)一本书的摘录:
方法区 在Java虚拟机实例中,有关加载类型的信息存储在称为方法区域的逻辑内存区域中。当Java虚拟机加载一个类型时,它使用类加载器来定位适当的类文件。类加载器读取类文件--二进制数据的线性流--并将其传递给虚拟机。虚拟机从二进制数据中提取有关类型的信息,并将信息存储在方法区域中。类中声明的类(静态)变量的内存也来自方法区域。
它清楚地指出,当加载类时,静态变量存储在方法区域中。据我所知,方法区域与堆不同。因此,这本书与提供的So链接是矛盾的。
有人能澄清一下这种混淆吗?
发布于 2015-06-27 18:32:48
在JVM内存模型中,静态变量的引用和值都存储在本身位于堆中的方法区域中。
方法区域是在虚拟机启动时创建的.尽管方法区域在逻辑上是堆的一部分,但是简单的实现可以选择不进行垃圾收集或压缩。
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.4
发布于 2015-06-27 18:27:37
来自JVM Documentaion:
方法面积 Java虚拟机有一个在所有Java虚拟机线程之间共享的方法区域。该方法区域类似于常规语言编译代码的存储区域,或类似于操作系统进程中的“文本”段。它存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化和接口初始化中使用的特殊方法(§2.9)。 方法区域是在虚拟机启动时创建的.虽然方法区域在逻辑上是堆的一部分,但是简单的实现可以选择不垃圾收集或压缩它。这个版本的Java规范并不要求方法区域的位置或用于管理编译代码的策略。
https://stackoverflow.com/questions/31091953
复制相似问题