新对象(new Object())在内存中预留了多少空间?

3

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


可能是Java中对象的大小是多少的重复问题。 - Andreas Fester
你可以使用Java API来实现这个功能。 - AllTooSir
可能更相关的内容:https://dev59.com/wGPVa4cB1Zd3GeqP4Utf - 这个问题是关于引用的,但回答也提到了对象大小。 - Andreas Fester
2个回答

15
任何在堆上创建的对象都需要的空间等于其实例变量的大小之和。
不,它所需的内存比这个多。还需要额外的内存来存储类型信息指针和与对象相关联的监视器(用于同步目的)。
准确的大小将因JVM(尤其是处理器架构)而异。此外,为了对齐目的,JVM可能会实现最小大小,但采用“字段前4个字节免费”的策略。例如,假设在64位JVM上,类型指针占用8个字节,监视器信息占用4个字节,则您可能仍希望分配16个字节而不是12个字节以进行对齐 - 在这种情况下,具有单个int字段的对象可以占用与普通Object实例相同的内存。

3

这个问题很广泛。

它取决于类变量或者你可以称之为Java状态内存使用。

它还需要一些额外的内存来存储头信息和引用。

Java对象使用的堆内存包括:

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

  • 引用字段的内存(每个4字节);

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

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

32位和64位JVM的Java对象头大小不同。

尽管这些是主要的内存消耗者,JVM有时也需要额外的字段,例如用于代码对齐等。

原始类型的大小

boolean 与 byte -- 1

char 与 short -- 2

int 与 float -- 4

long 与 double -- 8


你的意思是如果我们有超过1个对一个对象的引用,它会额外占用4个字节。 - Java_Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接