静态变量的实际内存位置是多少?

Reu*_*ben 27 java memory garbage-collection memory-management

静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便.那它在哪里?应该有一些装载的地方?

Sou*_*rav 32

我们的记忆中有3个部分:

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

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

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

  • 这个答案投了很多,但与http://stackoverflow.com/questions/3849634/static-allocation-in-java-heap-stack-and-permanent-generation/3849819#3849819相矛盾 (6认同)
  • Sourav,你能给你的消息来源吗? (3认同)

Pet*_*rey 19

加载类时会初始化静态字段,并在卸载该类的类加载器时将其丢弃.它们可以被清理,甚至可以在另一个类加载器中复制.

对于那些使用OSGi的应用程序,静态变量不能在应用程序的生命周期中存活多次.

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


Ste*_*n C 8

静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便.

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

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