2010-06-07 134 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