微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内存中的Java原始数组布局

以下是我想提出问题的两个样本(假设你在这里有JOL):
Layouter layout32Bits =  new HotSpotLayouter(new X86_32_DataModel());
Layouter layout64BitsComp = new HotSpotLayouter(new X86_64_COOPS_DataModel());

并使用此示例:

int [] ints = new int[10];  

System.out.println(ClassLayout.parseInstance(ints,layout32Bits).toPrintable());
System.out.println(ClassLayout.parseInstance(ints,layout64BitsComp).toPrintable());

这是两个输出

[I object internals:
  OFFSET  SIZE   TYPE DESCRIPTION             VALUE
  0     4        (object header)     09 00 00 00 (00001001 00000000 00000000 00000000) (9)
  4     4        (object header)     00 00 00 00 (00000000 00000000 00000000 00000000) (0)
  8     4        (object header)     10 1b 0c 1a (00010000 00011011 00001100 00011010) (437000976)
 12    40    int [I.<elements>            N/A
 52    12        (loss due to the next object alignment)
 Instance size: 64 bytes
 Space losses: 0 bytes internal + 12 bytes external = 12 bytes total

  [I object internals:
  OFFSET  SIZE   TYPE DESCRIPTION             VALUE
  0     4        (object header)     09 00 00 00 (00001001 00000000 00000000 00000000) (9)
  4     4        (object header)     00 00 00 00 (00000000 00000000 00000000 00000000) (0)
  8     4        (object header)     10 1b 0c 1a (00010000 00011011 00001100 00011010) (437000976)
 12     4        (object header)     01 00 00 00 (00000001 00000000 00000000 00000000) (1)
 16    40    int [I.<elements>            N/A
 56     8        (loss due to the next object alignment)
 Instance size: 64 bytes
 Space losses: 0 bytes internal + 8 bytes external = 8 bytes total

我主要理解输出,我不知道的是这些是什么:

12 bytes external and 8 bytes external

通常,对象是8字节对齐的,那么为什么需要添加比所需更多的填充?

我知道一些奇怪的东西,the first one has to do with the API that JOL is using和第二个has to do with internal data,that needs to be hidden.

我也知道this,但它似乎没有关系,因为它意味着内部填充.

有人可以对此有所了解吗?

解决方法

实例大小:为当前VM配置计算64个字节,但您明确指定了不同(不兼容)的Layouter.

实际尺寸(用Instrumentation.getObjectSize计算)和预期尺寸(由Layouter计算)之间的差异将被视为由于下一个对象对齐而导致的损失.

ClassLayout.java

原文地址:https://www.jb51.cc/java/128704.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐