繁体   English   中英

Java:静态字段存在于内存中的哪个位置?

[英]Java: where do static fields live within the memory?

如果我们将对象存储在对象的静态字段中,JVM如何为它分配内存? 它是否存在于“隐含”(不确定我是否使用正确的单词)类对象中? 静态字段与对象字段有何不同?

静态字段是类变量,并在该类的所有实例之间共享。 实例变量(或我认为你称之为的对象字段)属于类的各个实例,不共享。

至于它们存储在内存中的位置将基于JVM的实现,并且没有理由需要两个不同的JVM来按规范将它们存储在同一个地方(据我所知至少 - 应该插入适当的规格表链接在这里)。

正如Nick的回答所说,语言规范没有规定具体的“物理”位置,但就你可以推理的逻辑心理模型而言,它可能会帮助你将静态字段视为附加到类对象(这些字段所属的类的Foo.class )。

例如,调用时:作为题外话,类对象被以其他方式与静态实体处理时(即语言规范中规定)中使用synchronized静态方法,锁被保持在类方法的类对象上属于。

静态字段是类的一部分; 据说,当班级被卸下时,它们会消失。 将它们想象成靠近Class实例是有意义的。 有关内存如何布局的详细信息超出了Java应用程序的范围; 作为必然结果,JVM规范没有强制要求该主题。 即使是卸载类时字段的“消失”也无法直接观察到,只能通过GC操作,假设有一个良好放置的finalize()方法。

静态字段存储在Class对象中,该对象保存在PemGen空间中。 这是堆内存的一部分。

正如NickLarsen所说,我认为没有任何JVM规范如何存储静态字段。 编译定义的常量(static final)将在编译期间替换最可能的表达式。 对于变量静态字段,只有两个选项:堆或(如果存在)JVM的数据段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM