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个整数对象的引用。
答案 0 :(得分:2)
ArrayList
内部由Object[]
作为缓冲区支持,grows as needed。
对象数组实际上是一个对象引用数组。在您的情况下,看起来每个对象引用都是4 bytes,因此它们的数组将使用4 * length
个字节,加上一些开销,例如数组and other stuff的长度。
当允许ArrayList
自然增长时,缓冲区数组中任何未使用的索引都默认为null
,每个索引仍然使用4个字节的内存。
允许增长的ArrayList
可能已扩展为(4952 - 16)/ 4 = ~1234容量。
虽然不需要增长的ArrayList
只有 1000容量。