13

这是静态数组如何存储在 Java 内存中的后续问题?.

因此 C/C++ 中的全局变量存储在内存的静态数据段中。但是 Java/C++ 中的静态类变量呢?

它不能是静态数据段,因为您不知道在整个程序期间将引用什么/多少类(因为反射)。这绝对不是堆栈,因为这没有任何意义。将它存储在堆上也有点不确定。

4

3 回答 3

5

在 Java 中,在低级别,类静态变量确实与所有其他类元数据一起存储在堆中。对于 Java,它们看起来像全局变量,但对于 JVM 的低级堆管理例程,它们是动态数据(尽管为了提高 GC 效率,它们可能会被稍微特殊处理,因为它们很可能是长期存在的)。毕竟,可以通过取消引用类加载器来卸载类。

至于它是否与 C 相同malloc(),不太可能。大多数 JVM 在低级别控制它们的堆。他们从操作系统中获取一大块内存并自行分配。因此,大多数 Java 数据(包括静态数据)并不存储在 malloc 堆中,而是存储在由 JVM 管理的单独堆中。

于 2011-07-11T19:27:01.113 回答
3

Java 有一个“永久”堆,用于放置类元数据。所以静态值的“根”在永久堆中。这些值是参考值(类对象),值本身位于常规堆中。

于 2011-07-11T19:29:31.770 回答
1

静态变量不会存储在堆中。它们是数据段的一部分。局部变量将存储在 - 堆栈中;实例变量将存储在-Heap中;类变量(静态)将存储在 - 数据段中。这些变量将在该类的所有对象之间共享。您的最终机器等效 java 代码将存储在 - 代码/文本段中。

于 2012-09-17T10:17:06.587 回答