【发布时间】:2017-10-13 23:25:07
【问题描述】:
我对对象足迹理解有疑问:
我在 A 和 B
两种情况下运行以下行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 之间的差异是 128 个 Integer 实例(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]
【问题讨论】:
-
我看不出有什么区别。如果你检查这两种情况的平均值是一样的。我错过了什么吗?
-
@gatisahu 我会说平均值是每个实例的内存占用量,自然应该是相同的。
标签: java hashmap footprint jol