如果我们将对象存储在对象的静态字段中,JVM如何为它分配内存?它是否存在于“隐含”(不确定我是否使用正确的单词)类对象中?静态字段与对象字段有何不同?
答案 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空间中。这是堆内存的一部分。