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

静态variables是在程序执行的整个过程中分配的,所以堆栈和堆都不方便。 那它在哪? 应该有一个地方加载?

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

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

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

我们的记忆中有三段:

  1. 堆栈段 – 包含本地variables和引用variables(保存堆中对象地址的variables)。

  2. 堆段 – 包含运行时创build的所有对象,只包含对象及其对象属性(实例variables)。

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

静态variables是在程序执行的整个过程中分配的,所以堆栈和堆都不方便。

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

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

http://www.daniweb.com/software-development/java/threads/34695

静态variables的内存是在程序开始时,在常规内存中,而不是在堆栈中专门为程序分配的。 这样做的好处是它使你的variables或程序完全不变,而且不会意外地改变它的值。 这样做的缺点是,直到程序终止,内存才会被释放。 我从来没有听说任何静态值需要更多的内存比定期宣布,但他们的记忆使用是不断的。

在JVM使用的五个内存区域中,当在准备和加载阶段由Application类加载器加载类时,静态字段在Class Area(PremGen的一部分)中被分配内存。 如果该字段是基本字段,则该值存储在类区域中,如果是Objecttypes(使用了新运算符),则将其存储在堆中,但引用会分配给类区域中分配的静态字段variables。 当这个类被卸载时,这个静态字段的内存也可以被GC垃圾回收。

如果场也是最后一场,那就是静态的最后一场,那么这个场就保持在一个不变的池子里。