Java中带有泛型的基本包装器内存空间开销
我无法理解泛型的原始包装器开销 前 在下面的数据结构中,为什么没有将24字节的开销添加到每个项,而是为Java中带有泛型的基本包装器内存空间开销,java,generics,memory,heap-memory,Java,Generics,Memory,Heap Memory,我无法理解泛型的原始包装器开销 前 在下面的数据结构中,为什么没有将24字节的开销添加到每个项,而是为N输入添加一次 换言之,为什么总内存空间不是96N而不是24+72N,或者为什么24只增加一次 public class GenericMysteryBox<Item> { // 16(object overhead) private Node first; // 8 (reference) pr
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
}
公共类GenericSystemBox{//16(对象开销)
私有节点优先;//8(引用)
私有类节点{//16(对象开销)
//8(内部类开销)
private Item;//8(对整数的引用)
//24(整数)
私有节点下一步;//8(参考)
私有节点prev;//8(参考)
} // -------
//24+72N~72N
}
因为节点的类声明(作为内部类时)在实例之间是不可变的。也就是说,GenericMysteryBox
的每个实例都包含一个节点
,该节点(之后)有一个对象
引用和两个节点
引用
这与将节点
声明为非私有非内部类(忽略节点
的可见性)的行为完全相同
考虑一下
class Node<Item> {
private Item item;
private Node next;
private Node prev;
}
public class GenericMysteryBox<Item> {
private Node<Item> first;
}
类节点{
私人物品;
私有节点下一步;
私有节点prev;
}
公共类GenericSystemBox{
私有节点优先;
}
每个节点
都引用了相同的外部通用系统框
;它只是对同一个对象的引用,而不是每个对象的新外部对象。“它只是对同一个对象的引用”,那么为什么对象开销是N的倍数?每个节点都有开销。部分开销是一个参考。因此,每个节点
都要支付引用的费用,但所有这些引用都指向一个只占用内存一次的对象。@LouisWasserman我认为+24是上面代码第7行的24(整数)。您可以回答,但对于GenericSystemBox16(对象开销)和节点8(引用),事实是24。。是吗?什么?代码中没有任何整数。但是是的,这或多或少是正确的;24代表GenericMysteryBox
及其字段。您能解释一下吗?