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

时间:2010-01-26 19:58:06

标签: java class static

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

5 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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