试图理解JOLSample_16_AL_LL中ArrayList的足迹

时间:2016-09-12 03:00:46

标签: java arraylist jvm jol

以下是相关代码的链接 - http://hg.openjdk.java.net/code-tools/jol/file/07087260ce41/jol-samples/src/main/java/org/openjdk/jol/samples/JOLSample_16_AL_LL.java

impl<'a> Iterator for HoldsVecInRefCellIter<'a> {
    type Item = &'a i32;

    fn next(&mut self) -> Option<Self::Item> {
        self.vec_iter.next()
    }
}

当我按原样运行代码时,我看到以下内容:

public static void main(String[] args) throws Exception {
    out.println(VM.current().details());

    List<Integer> al = new ArrayList<Integer>();
    List<Integer> ll = new LinkedList<Integer>();

    for (int i = 0; i < 1000; i++) {
        Integer io = i; // box once
        al.add(io);
        ll.add(io);
    }

    PrintWriter pw = new PrintWriter(out);
    pw.println(GraphLayout.parseInstance(al).toFootprint());
    pw.println(GraphLayout.parseInstance(ll).toFootprint());
    pw.println(GraphLayout.parseInstance(al, ll).toFootprint());
    pw.close();
}

我不确定[Ljava.lang.Object;的4952字节在哪里;是来自。如果我更新ArrayList创建并将初始大小设置为1000以便没有增长,我得到以下内容:

java.util.ArrayList@5f205aad footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1      4952      4952   [Ljava.lang.Object;
      1000        16     16000   java.lang.Integer
         1        24        24   java.util.ArrayList
      1002               20976   (total)

感谢。

更新

我关闭了CompressedOops(-XX:-UseCompressedOops)。这是新结果:

java.util.ArrayList@5f205aad footprint:
 COUNT       AVG       SUM   DESCRIPTION
     1      4016      4016   [Ljava.lang.Object;
  1000        16     16000   java.lang.Integer
     1        24        24   java.util.ArrayList
  1002               20040   (total)

因此,当禁用CompressedOops时,引用大小会增加到8个字节。对我而言,更有意义的是Object数组保存了对1000个整数对象的引用。

1 个答案:

答案 0 :(得分:2)

ArrayList内部由Object[]作为缓冲区支持,grows as needed

对象数组实际上是一个对象引用数组。在您的情况下,看起来每个对象引用都是4 bytes,因此它们的数组将使用4 * length个字节,加上一些开销,例如数组and other stuff的长度。

当允许ArrayList自然增长时,缓冲区数组中任何未使用的索引都默认为null,每个索引仍然使用4个字节的内存。

允许增长的ArrayList可能已扩展为(4952 - 16)/ 4 = ~1234容量

虽然不需要增长的ArrayList只有 1000容量