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

时间:2011-07-11 19:25:10

标签: java c++ memory static-members class-variables

这是How are static arrays stored in Java memory?的后续问题。

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

它不能是静态数据段,因为您不知道在整个程序期间(由于反射)将要引用的类/数量。它绝对不是堆栈,因为这没有任何意义。将它存储在堆上也是一种不确定的行为。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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