【问题标题】:Integer vs int: with regard to memoryInteger vs int:关于内存
【发布时间】:2011-12-07 17:36:57
【问题描述】:

我想知道是否有不同的内存占用 Integer nint n

我知道int n正常占用4个字节,Integer n

【问题讨论】:

  • 唯一可能的答案是“视情况而定”。
  • stackoverflow.com/questions/76549/… 相关,虽然不是严格意义上的重复。
  • @KerrekSB 你能否详细说明为什么“这取决于?”
  • @craig:因为正如您在回答中所暗示的那样,这完全取决于 JVM 实现它希望为这些事情中的每一个占用多少堆空间。如果我没记错的话,没有什么可以阻止兼容的 JVM 将int 存储为 128 位,只要该决定不会泄露到托管程序。你只知道intInteger的“宽度”是一样的;它们都可以表示相同数量的值。

标签: java integer int


【解决方案1】:

一般来说,Hotspot 中 Java 对象使用的堆内存包括:

  • 一个对象头,由几个字节的“管家”信息组成;
  • 原始字段的内存,根据它们的大小(int n->32 位)
  • reference 字段的内存(每个 4 字节)(整数 n ->32 位)
  • 填充:在对象数据之后可能会“浪费”一些未使用的字节,以使每个对象从一个方便的字节倍数的地址开始,并减少表示对象指针所需的位数。

根据 Mark Peters 的建议,我想添加下面的链接 http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

【讨论】:

  • 赞成成为唯一用“在热点”中限定它的答案。但是因为没有引用你的来源而投反对票。
  • 感谢您的建议,我已添加站点链接以获取更多信息。
  • 还要注意,除了对象的堆内存需求(如果缓存实例被多次重复使用,这可能是“零”,就像Integer.valueOf(small)一样),你仍然需要将指向对象的指针存储在堆栈帧或包含对象中。那是另一个 32 位或 64 位,即指针也已经至少与 int 一样大。
  • 参考字段有什么用?
【解决方案2】:

Java 中的 Integer 对象占用 16 个字节。

我不知道运行 64 位和 32 位 JVM 是否会有所不同。对于原始类型,它无关紧要。但我不能确定 object 的内存占用在 64 位系统下如何变化(如果有的话)。

您可以在这里自行测试:

Java Tip 130: Do you know your data size?

【讨论】:

    【解决方案3】:

    int 是一种原始数据类型,需要 32 位(4 字节) 来存储。

    当您的 Java 代码使用 new 运算符创建 Java 对象的实例时,更多 分配的数据超出了您的预期。 例如,您可能会惊讶地发现 int 值与 Integer 对象(可以容纳 int 值的最小对象)的大小比为 通常是 1:4。

    Integer 是一个使用 128 位(16 字节) 来存储 int 值的对象。

    当我们使用 new Operator 创建新 Integer 时,它会按如下方式分配内存。

    1. Class 对象(32 位) - 由指向类信息的指针组成,在我们的例子中,它描述了指向 java.lang.Integer 类的对象

    2. 标志(32 位)- 描述对象状态的标志集合。 就像它是否有哈希码,它是否是数组,即它的形状。

    3. Lock(32 位) - 存储对象的同步信息。对象当前是否同步。

    超过 3 个点被称为对象的元数据

    1. 元数据后面是对象数据(32 位)本身。在 Integer 的情况下,它的单个 int 值。

    以上所有解释都是根据 32 位处理器架构。它可能与 JVM 版本vendor 不同。

    【讨论】:

      【解决方案4】:

      对于 int:没有包装器的每个元素使用 4 个字节,有包装器的每个元素使用 16 个字节。

      包装的双精度报告为每个元素 24 字节,实际双精度值为 64 位(8 字节)。

      更多详情here

      【讨论】:

        猜你喜欢
        • 2018-12-16
        • 1970-01-01
        • 2011-08-30
        • 2011-08-17
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 2011-04-25
        • 2012-10-02
        相关资源
        最近更新 更多