静态变量的实际内存位置是什么?

静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便。那么这个变量在哪里呢?难道不应该有某个地方加载它吗?


答案 1

我们的记忆中有3个片段:

  1. 堆栈段 — 包含局部变量和引用变量(保存堆中对象地址的变量)。

  2. 堆段 — 包含运行时中创建的所有对象,仅对象及其对象属性(实例变量)。

  3. 代码段 — 实际编译的 Java 字节码在加载时所在的段。静态成员(变量或方法)称为类成员,这意味着它们位于类(字节码)所在的位置,即代码段中。


答案 2

静态字段在装入类时初始化,在卸载该类的类装入器时被丢弃。它们可以被清理,甚至可以在另一个类装入器中复制。

对于像使用 OSGi 的应用程序,静态变量不会在应用程序的整个生命周期内存在。它们可以多次重新加载。

如何实现它可能依赖于 JVM,但 Sun/Oracle JVM 会创建一个“对象”来保存类的静态字段。此对象可通过 Unsafe 类访问,该类也可用于检查此“对象”字段。