【问题标题】:Are the instance variables for an object stored in continguous memory对象的实例变量是否存储在连续内存中
【发布时间】:2021-08-25 23:43:02
【问题描述】:

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

【问题讨论】:

  • 一般来说,我相信答案是肯定的,尽管Java实际上并不能保证这一点。当然,对其他对象的任何引用也几乎不会与持有其引用的对象连续。
  • 无法从 Java 中确定这一点,同样,这对纯 Java 程序也无所谓。

标签: java variables memory-management instance


【解决方案1】:

一般来说,答案是肯定的;但这是未指定的。有一个库specifically designed for this,你可以玩玩。

例如对于这样的类:

static class Example {
    byte b = 1;
    int x = 3;
    long l= 12;
}

你可以看到它的布局(通过ClassLayout.parseClass(Example.class).toPrintable()):

 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

请注意字段如何更改其位置(以减少填充),以及有 7 个字节的填充这一事实。

越深入,事情就会变得越来越有趣,例如继承,或者由其他对象组成的对象。该库中的示例以这种方式非常丰富。

【讨论】:

  • 这就是我的设想。所以对象的内存分配类似于数组元素,考虑到数组是一个对象,这很有意义。谢谢。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 2019-01-12
  • 2013-09-15
  • 2014-02-17
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多