gpt4 book ai didi

java - HashMap 的 jol 足迹

转载 作者:行者123 更新时间:2023-11-30 10:29:38 29 4
gpt4 key购买 nike

我对对象足迹的理解有问题:

我在 AB

两种情况下运行以下行
out.println(VM.current().details());
HashMap<Integer, Integer> hashMap = new HashMap<>();
A:
for (int i = 0; i < 1000; i++) {
hashMap.put(i, i);
}
B:
for (int i = 0; i < 1000; i++) {
hashMap.put(1000 + i, i);
}

PrintWriter pw = new PrintWriter(out);
pw.println(GraphLayout.parseInstance(hashMap).toFootprint());

案例 A 结果是:

java.util.HashMap@1f89ab83d footprint:
COUNT AVG SUM DESCRIPTION
1 8208 8208 [Ljava.util.HashMap$Node;
1872 16 29952 java.lang.Integer
1 48 48 java.util.HashMap
1000 32 32000 java.util.HashMap$Node
2874 70208 (total)

案例 B 结果是:

java.util.HashMap@1f89ab83d footprint:
COUNT AVG SUM DESCRIPTION
1 8208 8208 [Ljava.util.HashMap$Node;
2000 16 32000 java.lang.Integer
1 48 48 java.util.HashMap
1000 32 32000 java.util.HashMap$Node
3002 72256 (total)

A 和 B 之间的差异是 Integer 的 128 个实例(1872 对 2000)。第一个假设是 IntegerCache 影响,但它并没有解释我心目中的情况 B。

问题:为什么这两个足迹不同?

详情:

jol: "org.openjdk.jol:jol-core:0.8"

# 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]

最佳答案

Java 确实有一个 cache for Integer instances with values between -128 and 127 (当使用自动装箱或直接使用 Integer.valueOf(int) 时)。因此 put(i,i) 将使用相同的实例,而 put(1000 + i, i) 甚至 put(1000 + i, 1000 + i) 不会。

put(i,i) 将为值 0 到 127(即 128 个实例)使用缓存,并在两种情况下返回相同的 Integer 实例。

put(1000 + i,i) 将为键创建一个新的 Integer 实例,但将缓存用于值 0 到 127(即 128 个实例)

put(1000 + i, 1000 + i) 将为键和值创建新的 Integer 实例,即使它们具有相同的数值。因此,如果您这样做,您应该会看到创建了 128 个额外的 Integer 实例。

关于java - HashMap<Integer, Integer> 的 jol 足迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975039/

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