Java中带有泛型的基本包装器内存空间开销

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

我无法理解泛型的原始包装器开销

在下面的数据结构中,为什么没有将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
}
公共类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
及其字段。您能解释一下吗?