哪里是静态类变量存储在内存中

Where are static class variables stored in memory?

本文关键字:存储 内存 类变量 静态类 静态      更新时间:2023-10-16

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

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

它不能是静态数据段,因为你不知道在整个程序的持续时间内会引用什么/多少个类(因为反射)。它肯定不是堆栈,因为那没有意义。

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

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

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

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