gpt4 book ai didi

java - Java类的内存对齐

转载 作者:搜寻专家 更新时间:2023-10-31 08:31:45 28 4
gpt4 key购买 nike

假设我在一台 64 位机器上用 gcc 编译一个 C 程序。我假设 sizeof(int) 是 8 个字节,sizeof(char) 是 1 个字节。

由于内存对齐,以下结构:

struct example{
int a;
char c;
}

的大小实际上不是 9 个字节,而是 16 个(sizeof(int) 的两倍),因此它的起始地址和结束地址都可以是字大小的倍数(假定为 8 个字节)在这里)。

我想知道以下类在 Java 8 中有多大:

class Node {
int val;
Node left, right;
boolean flag;
}

我基本上不确定我们是按 8 字节还是 4 字节的倍数对齐。

最佳答案

您可以使用 jol了解对象的确切布局。这是您的 Node 类程序的输出(在 Oracle JDK 1.8.0_121 64 位上):

# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

org.example.Node object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 70 22 01 f8 (01110000 00100010 00000001 11111000) (-134143376)
12 4 int Node.val 0
16 1 boolean Node.flag false
17 3 (alignment/padding gap) N/A
20 4 Node Node.left null
24 4 Node Node.right null
28 4 (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total

所以,对齐是8个字节。

请注意,这是特定于平台的。您不应过分依赖此信息。

关于java - Java类的内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44468639/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com