静态类变量存储在内存中的什么位置?

这是一个后续问题,静态数组如何存储在 Java 内存中?

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

它不能是静态数据段,因为您不知道在整个程序持续时间内将引用什么/多少个类(因为反射)。这绝对不是堆栈,因为这毫无意义。将其存储在堆上也有点麻烦。


答案 1

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

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


答案 2

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