我想弄清楚Java結構/如何爲對象分配內存。 (是的,這是特定於實現的,我爲此使用了Oracle 1.7運行時。)我在這個here和here上做了一些工作,結果很混亂。Java如何爲對象的成員構造內存?
首先,在兩個引用的鏈接中,當我分配一個對象數組時,相當於新的Object [10000],它使用了每個對象4個字節。在32位系統上,這非常合理。但是我在64位系統上,所以這裏發生了什麼?
- 是Java的限制在32位地址空間,即使在64位系統?
- Java是否限於每個數組的32位地址空間,並且每個數組對象都有一個指向元素所在的指針?
- 還有別的嗎?
二,I compared the memory footprint of 8 booleans vs. a byte as the variables in a class。 8個布爾值需要24個字節/對象或3個字節/布爾值。單字節方法需要10個字節/對象。
- 3字節/布爾值是怎麼回事?我會理解4(使每個int),並明確1(使每個字節。但3?
- 什麼是擴展一個字節到10個字節?我會明白8它擴展一個字節本地int(I在64位的系統上「M),但與其他2個字節是什麼?
而且在different ways to create a RGB class it gets really weird的情況。
- 對於3個字節變量組成的類,它使用24個字節/實例。昂貴但易於理解,因爲每個使用int。
- 所以我試着每個類是一個單一的int w將int存儲在部分int中(使用位移)。而且它仍然是24字節/實例。爲什麼Java需要3個存儲空間?這沒有意義。
- 但最奇怪的情況是類中有一個變量「byte [] color = new byte 3;」請注意,字節被分配,所以它不只是一個空指針。這種方法比其他兩種方法佔用更少的內存。怎麼樣???
任何有關這裏發生的事情的指導,我們都很感激。我有一些分配很多的類,並且飛輪模式將不起作用(這些對象的值會在整個地方改變)。
和一個相關的問題,是否聲明變量的順序很重要?早在我進行C++編程時,聲明「int,byte,int,byte」使用了4 int的空間工作,而使用了「int,int,byte,byte」3.
Java Runtime同時有64位和32位版本。 – OmniOwl
不指定內存如何實際使用的好處是,你可以有不同的方式來做到這一點。相關:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html(64bit vm中的32位指針) – zapl