在構建包含這些字段的對象時,Java分配多少內存用於聲明字段private char letter;
和private int size;
?聲明一個字段的內存分配
回答
這取決於虛擬機的實施。該規範指定char基元類型的值範圍爲16位,但未指定虛擬機必須如何將對象存儲在堆上。
不需要這樣詳細的規範,因爲VM不必從堆中交換或序列化原始對象。
要你的澄清反應在評論:同樣,它取決於執行,但也有幾個很好的理由來分配內存中所有類的對象是「創建時間屬性一次」。如果我們決定懶惰分配,那麼我們必須添加一些機制,以便在運行時動態調整堆上的對象,這非常昂貴。
如果我們在開始時立即保留所有空間,那麼我們不必在堆上調整大小或重新定位數據,因爲數據結構的大小永遠不會增長或縮小。
我不知道JVM, 的具體情況,但如果能夠幫助你char
基本型採用16位(Unicode字符)來存儲數據,並int
使用32位
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
我想你可以通過創建一個非常簡單的Java應用程序和一個非常簡單的對象來測試它。 在沒有聲明字段的情況下運行應用程序,並檢查它使用多少內存(Windows中的Ctrl + Shift + Escape),然後在分配這些字段時重新運行並檢查差異。
當創建對象時,存儲基元類型的Java類中的字段將使用默認值進行初始化,所以我會想象內存將被分配。
這是依賴於實現的。
早期的JVM實現更接近類文件格式。在這種情況下,byte
,short
,char
,int
,float
和引用佔用一個時隙; long
和double
兩個插槽。所以,有效地將大小調整爲四個字節,這就是它在對象中佔用的內存量。然後,對象的總數(包括頭部)通常會舍入爲8個字節,以便更好地進行內存對齊。對於「壓縮的oops」(64位平臺上的32位引用,其中64位地址的底部位始終爲零,允許引用被移位並使用超過4 GB,同時將引用保持爲4字節),那裏是強大的壓力,以適應更大的尺寸。
但是在十年的最佳時間裏,我們有64位的JVM。這意味着更多的浪費,包括處理器內存帶寬方面的浪費。所以在現代實現中,對象佈局被壓縮,使得對象使用盡可能多的內存(加上頭部和對齊舍入)。
插槽只適用於本地變量而不是字段。一個64位的引用仍然只佔用一個插槽,並且與使用的內存量無關。特別是如果它們映射爲使用寄存器。 –
@Peter Lawrey快速瀏覽JVM規範,似乎表明與本地人不同的字段不區分32位和64位類型。您可以在同一個本地空間中獲得兩個64位引用或整數,例如一個long或double。所以64位JVM在解釋字節碼時不會那麼簡單。 IIRC,這是改變對象內場的佈局的力量。 –
在Oracle/Sun JVM中,每個對象都分配在一個8字節的邊界上。因此添加字段可能不會增加使用的內存量。但是作爲指導這裏是原語
type typical size
byte, boolean 1 byte
char, short 2 bytes
int, float 4 bytes
long, double 8 bytes
的尺寸是否JVM是32位或64位,使爲原始的大小沒有差異,但它確實改變參考的默認大小。
- 1. 聲明/初始化和內存分配
- 2. 聲明一個不變的類字段
- 3. 分配枚舉(聲明一個結構內)的值的struct
- 4. 將多個值分配給一個聲明的字符串
- 5. 聲明一個類的內部變量和分配值動態
- 6. c + +中可變的內存聲明一個字符串字面
- 7. 分配連續的內存到一個二維數組聲明後
- 8. 更新一個字段聲明爲VAL
- 9. 當聲明向量時神祕的malloc內存分配錯誤
- 10. 我們聲明靜態時分配的內存在哪裏?
- 11. 將聲明多個具有相同內容的字符串文字分配額外的內存嗎?
- 12. 聲明內部類名稱作爲另一個聲明的一部分
- 13. C編程 - 將未聲明的字符串傳遞給函數(內存分配)
- 14. 字符串聲明分段錯誤
- 15. c#中的聲明是分配內存還是分配內存的新運算符?
- 16. 內存分配中的分段錯誤
- 17. 內存分配在循環變量聲明
- 18. 變量聲明,初始化和unamanaged內存分配
- 19. 聲明和內存分配到目標參數在copy_from_user調用
- 20. 羅斯林檢查如果字段聲明已分配給
- 21. 聲明多個結構並將它們覆蓋在已分配的內存上
- 22. 是否每個聲明爲指針的變量都必須分配內存?
- 23. 聲明一個變量vs動態分配內存給C++中的一個變量?
- 24. 當在一個類中聲明一個新的數組時,內存分配是否有區別?
- 25. 聲明一個ThreadLocal字典
- 26. 分配標籤與聲明
- 27. 聲明和分配變量
- 28. 聲明順序和分配
- 29. 布爾分配VS聲明
- 30. 分配與函數聲明
我想知道的是當這些16位被分配時 - 在構造對象時或者在啓動字段時('size = 3;')。 – bancer
您可以使用我建議的方式輕鬆測試它,如果我現在沒有更重要的工作要做,我會立即嘗試。我可能會在稍後發佈結果。 我想這也可能取決於如何配置JVM – dominicbri7