Java 对象的实例变量是否存储在连续内存中
对象的实例变量是否像数组中的元素一样存储在连续内存中?假设您有一个名、年龄和年级实例变量的学生类def。构建学生类的实例时,实例变量是否存储在连续内存中?通常,答案是肯定的;但这是未指定的。有一个图书馆,你可以随便玩玩 例如,对于以下类:Java 对象的实例变量是否存储在连续内存中,java,variables,memory-management,instance,Java,Variables,Memory Management,Instance,对象的实例变量是否像数组中的元素一样存储在连续内存中?假设您有一个名、年龄和年级实例变量的学生类def。构建学生类的实例时,实例变量是否存储在连续内存中?通常,答案是肯定的;但这是未指定的。有一个图书馆,你可以随便玩玩 例如,对于以下类: static class Example { byte b = 1; int x = 3; long l= 12; } 您可以查看其布局(通过ClassLayout.parseClass(Example.class).toPrinta
static class Example {
byte b = 1;
int x = 3;
long l= 12;
}
您可以查看其布局(通过ClassLayout.parseClass(Example.class).toPrintable()
):
请注意字段是如何改变其位置的(以减少填充),以及存在7字节填充的事实
当你深入研究这个问题时,事情变得越来越有趣,比如继承,或者由其他对象组成的对象。该库中的示例以这种方式非常丰富。一般来说,我相信答案是肯定的,尽管Java实际上并不能保证这一点。对其他对象的任何引用当然,这些其他对象几乎永远不会与保存其引用的对象相邻。从Java无法确定这一点,同样,对于纯Java程序来说,这也不可能有任何影响。这就是我所设想的。因此,对象的mem分配类似于数组元素,如果数组是一个对象,这是有意义的。谢谢。
Example object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 4 int Example.x N/A
16 8 long Example.l N/A
24 1 byte Example.b N/A
25 7 (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 0 bytes internal + 7 bytes external = 7 bytes total