Primitive-wrapper使用泛型的内存空间开销,在Java中

时间:2016-02-22 02:53:06

标签: java generics memory heap-memory

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

离。

在下面的数据结构中,为什么不会为每个项目添加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
}

1 个答案:

答案 0 :(得分:0)

因为Node的类声明(虽然是内部类)在实例之间是不可变的。也就是说,GenericMysteryBox的每个实例都包含一个Nodetype erasure之后)有一个Object引用和两个Node引用。

这与将Node声明为非私有非内部类(忽略Node的可见性)的行为完全相同。

考虑,

class Node<Item> {
    private Item item;
    private Node next;
    private Node prev;
} 

public class GenericMysteryBox<Item> {   
    private Node<Item> first;            
}