3

我只是想知道如果我创建一个像“New Object()”这样的新对象,内存中会保留多少空间。因为在堆上创建的任何对象占用的空间等于其实例变量大小的总和。

4

2 回答 2

16

因为在堆上创建的任何对象占用的空间等于其实例变量大小的总和。

不,它需要更多的内存。指向类型信息的指针和与对象关联的监视器(用于同步目的)需要额外的内存。

确切的大小将因 JVM(尤其是处理器架构)而异。出于对齐目的,JVM 也有可能实现最小大小,但获得“前 4 个字节的字段空闲”策略。例如,假设在 64 位 JVM 上,类型指针占用 8 个字节,监视器信息占用 4 个字节,您可能仍希望分配 16 个字节而不是 12 个字节用于对齐目的 - 在这种情况下,具有单个int字段的对象可能占用与普通Object实例相同的内存。

于 2013-05-17T08:13:50.697 回答
3

这个问题将是一个非常广泛的问题。

它取决于类变量,或者您可以在 java 中调用状态内存使用情况。

它还对标头和引用有一些额外的内存要求。

Java 对象使用的堆内存包括

  • 原始字段的内存,根据它们的大小(参见下面的原始类型的大小);

  • 参考字段的内存(每个 4 个字节);

  • 一个对象头,由几个字节的“管家”信息组成;

Java 中的对象还需要一些“管家”信息,例如记录对象的类、ID 和状态标志,例如对象当前是否可访问、当前是否已同步锁定等。

Java 对象标头大小在 32 位和 64 位 jvm 上有所不同。

虽然这些是主要的内存消费者,但 jvm 有时也需要额外的字段,例如代码对齐等

原始类型的大小

布尔值 & 字节-- 1

字符 & 短-- 2

整数和浮点数——4

长 & 双-- 8

于 2013-05-17T08:14:20.390 回答