什么是静态变量的实际内存空间?

静态变量分配给整个程序执行期间,所以堆栈和堆都不方便。 那它在哪里? 应该有一些地方加载?


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

对于那些使用OSGi的应用程序来说,静态变量在应用程序的整个生命周期内都不会生效,可以重新加载多次。

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


我们的记忆中有三段:

  • 堆栈段 - 包含本地变量和引用变量(保存堆中对象地址的变量)。

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

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


  • 静态变量分配给整个程序执行期间,所以堆栈和堆都不方便。

    实际上,静态帧(即保存静态变量的帧)是从堆中分配的。

    在程序执行期间它们不一定存在。 例如,如果父类加载器,所有类和所有实例都变得无法访问,则可以垃圾收集动态加载的类的静态帧。

    链接地址: http://www.djcxy.com/p/82855.html

    上一篇: What is the actual memory place for static variables?

    下一篇: Where are static methods and static variables stored in Java?