9

我正在学习 java,我记得在某处读到 java 对象在 JVM 内部有一些开销,虚拟机出于管理原因使用了这些开销。所以我的问题是,有人能告诉我是否以及如何在 HotSpot JVM 中获取对象的总大小,以及它可能带来的任何开销吗?

4

3 回答 3

12

你不能直接得到开销。开销的数量取决于实现,并且可能因许多因素而异(例如,精确的 JVM 版本,以及您使用的是 32 位还是 64 位 JVM)。

然而,可以相当安全地假设,在 HotSpot 等典型的现代 JVM 实现中,每个对象的开销在 8 到 16 个字节之间。数组的开销通常比其他对象大 4 个字节(包含整数数组长度)。

也可以看看:

于 2012-06-13T09:52:21.703 回答
1

我发现这篇文章内容丰富,尽管我对表中提到的一些值有一些疑问

于 2012-06-13T09:52:38.930 回答
0

这是对象头、对象开销、数组头、对象引用的片段。希望它对某人有所帮助,如果不是 OP,因为这是一个很老的问题。

    private static int OBJ_HEADER;
    private static int ARR_HEADER;
    private static int INT_FIELDS = 12;
    private static int OBJ_REF;
    private static int OBJ_OVERHEAD;
    private static boolean IS_64_BIT_JVM;

     static {
    String arch = System.getProperty("sun.arch.data.model");

    IS_64_BIT_JVM = (arch == null) || arch.contains("32");
    OBJ_HEADER = IS_64_BIT_JVM ? 16 : 8;
    ARR_HEADER = IS_64_BIT_JVM ? 24 : 12;
    OBJ_REF = IS_64_BIT_JVM ? 8 : 4;
    OBJ_OVERHEAD = OBJ_HEADER + INT_FIELDS + OBJ_REF + ARR_HEADER;
       }

我应该说我只知道解决方案,但我还没有弄清楚为什么会这样。这就是为什么人们应该在他们的代码中留下评论......哦,好吧,当我弄清楚时,我会分享它背后的逻辑。

于 2019-11-08T14:39:48.533 回答