静态变量的实际内存位置是什么?
2022-09-01 05:47:36
静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便。那么这个变量在哪里呢?难道不应该有某个地方加载它吗?
静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便。那么这个变量在哪里呢?难道不应该有某个地方加载它吗?
我们的记忆中有3个片段:
堆栈段 — 包含局部变量和引用变量(保存堆中对象地址的变量)。
堆段 — 包含运行时中创建的所有对象,仅对象及其对象属性(实例变量)。
代码段 — 实际编译的 Java 字节码在加载时所在的段。静态成员(变量或方法)称为类成员,这意味着它们位于类(字节码)所在的位置,即代码段中。
静态字段在装入类时初始化,在卸载该类的类装入器时被丢弃。它们可以被清理,甚至可以在另一个类装入器中复制。
对于像使用 OSGi 的应用程序,静态变量不会在应用程序的整个生命周期内存在。它们可以多次重新加载。
如何实现它可能依赖于 JVM,但 Sun/Oracle JVM 会创建一个“对象”来保存类的静态字段。此对象可通过 Unsafe 类访问,该类也可用于检查此“对象”字段。