gpt4 book ai didi

java - 使用 VisualVM 堆转储计算 java 对象的内存使用情况与理论方法不符

转载 作者:行者123 更新时间:2023-12-03 18:48:21 29 4
gpt4 key购买 nike

我带着一个简单的问题而来。根据 java 文档和许多关于 java 内存对象布局的文章,如果我们有一个带有一个 int 变量的类,该对象的总内存消耗将为:

  • 8字节为标题
  • 4字节为int
  • 4 字节填充(将总数四舍五入为 8 字节的倍数)= 总共 16 字节
public class Ab {        
int b;
}

public static void main(String args[]) throws InterruptedException {
Ab ab = new AB();
}

我现在的问题是,当我使用 Visual vm 并查看堆转储以观察这个理论方法时,我注意到该对象的内存消耗是 20 字节而不是 16?为什么会这样?谁能给我解释一下?

最佳答案

使用 Java Object Layout工具我收到以下输出:

 OFFSET  SIZE   TYPE DESCRIPTION        VALUE
0 12 (object header) N/A
12 4 int Ab.b N/A

Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

并使用 -XX:-UseCompressedOops VM 选项(禁用压缩引用):

 OFFSET  SIZE   TYPE DESCRIPTION                                VALUE
0 16 (object header) N/A
16 4 int Ab.b N/A
20 4 (loss due to the next object alignment)

Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

Java环境:

java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)

关于java - 使用 VisualVM 堆转储计算 java 对象的内存使用情况与理论方法不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53597952/

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