Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象的实例变量是否存储在连续内存中_Java_Variables_Memory Management_Instance - Fatal编程技术网

Java 对象的实例变量是否存储在连续内存中

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

对象的实例变量是否像数组中的元素一样存储在连续内存中?假设您有一个名、年龄和年级实例变量的学生类def。构建学生类的实例时,实例变量是否存储在连续内存中?

通常,答案是肯定的;但这是未指定的。有一个图书馆,你可以随便玩玩

例如,对于以下类:

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