整数与整数:关于记忆

Tim*_*oad 38 java int integer

我想知道所占用的内存是否存在差异 Integer n,并且int n.

我知道int n通常占用4个字节,怎么样Integer n

Nou*_*lan 42

通常,Hotspot中Java对象使用的堆内存包括:

  • 一个对象标题,由几个字节的"管家"信息组成;
  • 原始字段的内存,根据它们的大小(int n-> 32位)
  • 参考字段的内存(每个4字节)(整数n - > 32位)
  • padding:在对象数据之后可能有一些"浪费"未使用的字节,使每个对象从一个方便的字节倍数的地址开始,并减少表示指向对象的指针所需的位数.

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


Cra*_*tis 8

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

我不知道运行64位和32位JVM是否有所不同.对于原始类型,它并不重要.但我不能确定对象的内存占用情况如何在64位系统下发生变化(如果有的话).

你可以在这里自己测试一下:

Java技巧130:你知道你的数据大小吗?


nav*_*ath 8

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

\n\n

当您的 Java 代码使用 new 运算符创建 Java 对象的实例时,\n分配的数据比您预期的要多得多。\n例如,您可能会惊讶地发现 int 值与 Integer 对象的大小比\xe2\x80\x94 可以容纳 int 值 \xe2\x80\x94 的最小对象\n通常为 1:4。

\n\n

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

\n\n

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

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

  2. \n
  3. 标志(32 位)- 它是描述对象状态的标志集合。\n比如它是否具有哈希码,它是否是数组,即它的形状。

  4. \n
  5. (32位)-它存储对象的同步信息。对象当前是否同步。

  6. \n
\n\n

以上三点称为Object的元数据。

\n\n
    \n
  1. 最后,元数据后面是对象数据(32 位)本身。如果是 Integer,则为单个 int 值。
  2. \n
\n\n

以上所有解释均基于 32 位处理器架构。它可能与JVM 版本供应商不同。

\n