java - 原始包装器内存空间开销与泛型,在 Java 中

标签 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
}

最佳答案

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

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

考虑一下,

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

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

关于java - 原始包装器内存空间开销与泛型,在 Java 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35545057/

相关文章:

java - 如何在使用方法输出并返回结果时计算字符串中的元音和辅音并将首字母大写

java - 转到在 RecyclerView 上选择的项目

c# - 使用泛型和支持子类跟踪实例

iOS : ARC, 未释放内存

java - Gradle 7 创建一个 fat jar

java - 如何使用 Java 使用 SqlDataReader?

c# - 性能:从泛型派生的类型

c# - 将泛型但已知为可空枚举类型转换为可空 int

小型存储设备中的内存分配

r - 在 R 的 ompr 包中,如何重新表述我的目标/约束/变量以避免 "problem too large"错误?