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

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

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

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

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

另外,在处理静态实体时,类对象以其他方式(由语言规范规定)使用:例如,当调用synchronized静态方法时,锁定保存在类的类对象上属于。

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

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

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