Reu*_*ben 27 java memory garbage-collection memory-management
静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便.那它在哪里?应该有一些装载的地方?
Sou*_*rav 32
我们的记忆中有3个部分:
堆栈段 - 包含局部变量和引用变量(保存堆中对象地址的变量).
堆段 - 包含运行时中的所有已创建对象,仅包含对象及其对象属性(实例变量).
代码段 - 加载时实际编译的Java字节码所在的段.静态成员(变量或方法)称为类成员,这意味着它们驻留在类(字节码)所在的位置,即代码段中.
Pet*_*rey 19
加载类时会初始化静态字段,并在卸载该类的类加载器时将其丢弃.它们可以被清理,甚至可以在另一个类加载器中复制.
对于那些使用OSGi的应用程序,静态变量不能在应用程序的生命周期中存活多次.
这是如何实现的可能是JVM依赖,但Sun/Oracle JVM创建一个"对象"来保存类的静态字段.可以通过Unsafe类访问此对象,该类也可用于检查此"对象"字段.
静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便.
实际上,静态帧(即保存静态变量的帧)是从堆中分配的.
并且在程序执行期间它们不一定存在.例如,如果父类加载器,所有类和所有实例都变得无法访问,则动态加载的类的静态帧可以被垃圾收集.