内存中的Java原始数组布局
发布时间:2020-12-15 03:04:22 所属栏目:Java 来源:网络整理
导读:以下是我想提出问题的两个样本(假设你在这里有JOL): Layouter layout32Bits = new HotSpotLayouter(new X86_32_DataModel());Layouter layout64BitsComp = new HotSpotLayouter(new X86_64_COOPS_DataModel()); 并使用此示例: int [] ints = new int[10];
以下是我想提出问题的两个样本(假设你在这里有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.
实际尺寸(用 见ClassLayout.java (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |