如果我们将对象存储在对象的静态字段中,JVM如何为其分配内存?它是否存在于“隐式”(不确定我是否使用了正确的单词)类对象中?静态字段与对象字段有何不同?
静态字段是类变量,它们在该类的所有实例之间共享。实例变量(或者我认为你所指的对象字段)属于类的各个实例,不会被共享。
至于它们在内存中的存储位置将基于JVM的实现方式,按规范没有理由要求两个不同的JVM将它们存储在同一位置上(据我所知 - 在此应插入适当的规范说明链接)。
Foo.class
)。另外,当处理静态实体时,类对象以其他方式使用(这些方式是由语言规范规定的):例如,当调用synchronized
静态方法时,锁定保持在该方法所属类的类对象上。synchronized
修饰的静态方法,它会锁定类对象,因为静态方法没有this
引用。(非静态的synchronized
方法在调用时锁定this
而不是类对象。) - C. K. Young静态字段是类的一部分;据说,它们在类被卸载时消失。可以想象它们就在该类的Class
实例附近。关于内存布局的详细信息超出了Java应用程序的范围;因此,JVM规范对此没有任何具体要求。即使在类被卸载时字段“消失”也不能直接观察到,只能通过GC操作来观察,假设有一个放置得当的finalize()
方法。
静态字段存储在Class对象中,该对象保存在PermGen空间中。这是堆内存的一部分。