【问题标题】:Primitive-wrapper Memory space overhead with generics, In Java使用泛型的原始包装器内存空间开销,在 Java 中
【发布时间】: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&lt;Item&gt;;它只是对同一个对象的引用,并不是每个对象的新外部对象。
  • “只是对同一个对象的引用”,那为什么对象开销是N的倍数呢?
  • 每个节点都有开销。部分开销是参考。因此,每个Node 都支付了引用 的成本,但所有这些引用都指向一个只占用一次内存的对象。
  • @LouisWasserman 我认为 +24 在上面代码的第 7 行是 24(整数)。你回答,但对于 GenericMysteryBox16(对象开销)和节点 8(参考)来说,事实是 24 .. 对吗?
  • 什么?您的代码中没有任何 Integers。但是,是的,这或多或少是正确的。 24 用于GenericMysteryBox 及其字段。

标签: java generics memory heap-memory


【解决方案1】:

因为Node(内部类)的类声明在实例之间是不可变的。也就是说,GenericMysteryBox 的每个实例都包含一个Node,它(在type 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;            
}

【讨论】:

  • 你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多