有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (5) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    至于它们在内存中的存储位置,则取决于JVM的实现,没有理由要求两个不同的JVM按照规范将它们存储在同一个位置(至少据我所知,应该在此处插入适当的规范表链接)

  3. # 3 楼答案

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

    另一方面,在处理静态实体时,类对象以其他方式使用(语言规范规定的):例如,当调用synchronized静态方法时,锁定该方法所属类的类对象

  4. # 4 楼答案

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

  5. # 5 楼答案

    静态字段是类的一部分;据推测,它们会在类卸载时消失。可以将它们想象为接近类的Class实例的某个地方。关于内存布局的细节超出了Java应用程序的能力范围;作为一个推论,JVM规范没有要求任何特定于该主题的内容。即使在卸载类时字段的“消失”也不能直接观察到,而只能通过GC操作来观察,假设使用了一个位置良好的finalize()方法