【发布时间】:2016-06-03 08:56:39
【问题描述】:
我无法理解泛型的原始包装器开销。
例如
在下面的数据结构中,为什么不向每个项目添加 24 字节开销,而是为 N 输入添加一次。
换个方式提问,为什么总内存空间不是 96N 而不是 24 + 72N 或者为什么 24 加一次。
public class GenericMysteryBox<Item> { // 16(object overhead)
private Node first; // 8 (reference)
private class Node { // 16(object overhead)
// 8 (inner class overhead)
private Item item; // 8 (reference to Integer)
// 24(Integer)
private Node next; // 8 (reference)
private Node prev; // 8 (reference)
} // -------
// 24 + 72N ~ 72N
}
【问题讨论】:
-
每个
Node都引用了同一个外部GenericMysteryBox<Item>;它只是对同一个对象的引用,并不是每个对象的新外部对象。 -
“只是对同一个对象的引用”,那为什么对象开销是N的倍数呢?
-
每个节点都有开销。部分开销是参考。因此,每个
Node都支付了引用 的成本,但所有这些引用都指向一个只占用一次内存的对象。 -
@LouisWasserman 我认为 +24 在上面代码的第 7 行是 24(整数)。你回答,但对于 GenericMysteryBox16(对象开销)和节点 8(参考)来说,事实是 24 .. 对吗?
-
什么?您的代码中没有任何
Integers。但是,是的,这或多或少是正确的。 24 用于GenericMysteryBox及其字段。
标签: java generics memory heap-memory