2010-06-07 138 views
2

我知道我总是发布有关数组内存使用情况的类似问题,但现在我想提出更具体的问题。java内存使用情况

后,我看了这篇文章:http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

我不明白一些事情:

  • 数据类型的大小总是也 相同的不同平台 (Linux/Windows的32/64位) 所以一个int将永远是32位?
  • 当我计算内存使用量时,我也要把 本身的参考值 ?如果我有一个对象到具有int字段的 类,其 内存将是12(object header)+ 4 reference + 4(int field)+ 3 (padding)= 24字节
+0

也许这可能有助于你解释为什么这对你如此重要? – leonm 2010-06-07 10:22:38

+0

仅用于教学目的。 – xdevel2000 2010-06-07 10:58:45

回答

1

int将始终为32位。但是,JVM规范并不要求对象的字段连续存储在内存中。因此,可能是,64位JVM可能会在64位边界上对齐int字段。 (当然,Sun 32位JVM的32位边界上的8位和16位字段对齐!)

+0

所以我们可以说,每个JVM实现可以选择多余的空间吗? – xdevel2000 2010-06-07 11:09:08

+0

不,我们不能这么说。或者至少,我们不能没有测试他们每一个人。 (这是不可能的,因为人们可以自由地创建自己的私人变体,例如基于OpenJDK代码库。) – 2010-06-07 11:21:23

1

首先,是的,根据the language specificationint总是32位。

您不应该(IMO)将引用本身包含在类本身的内存使用中,因为它不是对象的一部分。特别是,你不知道有多少地方会引用同一个对象:如果有10个不同的对象存储对象的引用,那么你最终将支付参考成本10次。但是,在计算任何存储它的成本时,您应该考虑参考 - 因此,如果您有一个带有作为参考的字段的类,那么请计算那里的成本。 (同样,如果你计算堆栈空间,考虑局部变量。)

+0

我不认为JLS在任何地方都指定了精确的位大小。指定的值范围仅意味着一个'int'必须是**至少** 32位宽。 JLS或JVM规范中没有任何内容指定“int”只能在内存中使用4个字节。 – 2010-06-07 11:52:00

+0

@Joachim:真的 - 由于字段对齐,即使只使用4个字节,它也可能占用更多。但是,值得注意的是,至少在*语言*级别,它是一个4字节的值。它会*总是*围绕在2^31等 – 2010-06-07 12:05:06