gpt4 book ai didi

java - Java中盒装原语的存储成本是多少?

转载 作者:IT王子 更新时间:2023-10-28 23:31:23 26 4
gpt4 key购买 nike

像 Java 中的 java.lang.Integerjava.lang.Character 这样的盒装原语有多大(以字节为单位)?

一个int是4个字节,一个典型的指针也是4个字节(如果没有被JVM压缩的话)。整数(没有缓存)的成本是 4 bytes + 4 bytes = 8 bytes 吗?盒子对象中是否有更多隐藏字段或与对象相关的额外开销(即,我不知道的对象是否有一般成本?)。

我对缓存问题不感兴趣。我知道JVM会缓存一定范围内的整数。

可以重新表述这个问题:用于装箱值与原始值的内存量相乘的最大因子是多少?

编辑:我确实了解 JVM 存在多种实现。典型 32 位 HotSpot 实现的典型成本是多少?

最佳答案

这是实现定义的,所以没有具体的答案。不过我应该可以回答热点。

您需要知道的是:Hotspot 总是在 8 字节边界上对齐对象。此外,每个对象都有 2 个单词开销。 [1]

如果我们把这些放在一起,我们会得到:

32 位 VM:4 字节整数 + 2 字对象头 = 12 字节。这不是 8 的倍数,因此 1 个整数的成本是 8 的下一个倍数:16 字节。

64 位 VM:4 字节整数 + 2 个字 = 20 字节。再次四舍五入:24 字节大小。

引用的大小显然不会影响对象本身的大小,除非它具有对其他对象的引用,而简单的 int 包装器则不是这种情况。如果可以的话,对于 64 位 JVM,我们将在现代 JVM 上使用 CompressedOops 的 32 位每个引用 4 字节和 4 字节的堆 <= 32gb (否则为 8 字节)。

[1]有兴趣的可以看看share/vm/oops/oop.hpp中的代码

关于java - Java中盒装原语的存储成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037468/

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