【问题标题】:jol footprint of HashMap<Integer, Integer>jol HashMap<Integer, Integer> 的足迹
【发布时间】:2017-10-13 23:25:07
【问题描述】:

我对对象足迹理解有疑问:

我在 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 之间的差异是 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


【解决方案1】:

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 实例被创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多