2011-06-30 21 views

回答

4

這取決於虛擬機的實施。該規範指定char基元類型的值範圍爲16位,但未指定虛擬機必須如何將對象存儲在堆上。

不需要這樣詳細的規範,因爲VM不必從堆中交換或序列化原始對象


要你的澄清反應在評論:同樣,它取決於執行,但也有幾個很好的理由來分配內存中所有類的對象是「創建時間屬性一次」。如果我們決定懶惰分配,那麼我們必須添加一些機制,以便在運行時動態調整堆上的對象,這非常昂貴。

如果我們在開始時立即保留所有空間,那麼我們不必在堆上調整大小或重新定位數據,因爲數據結構的大小永遠不會增長或縮小。

1

我不知道JVM, 的具體情況,但如果能夠幫助你char基本型採用16位(Unicode字符)來存儲數據,並int使用32位

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

我想你可以通過創建一個非常簡單的Java應用程序和一個非常簡單的對象來測試它。 在沒有聲明字段的情況下運行應用程序,並檢查它使用多少內存(Windows中的Ctrl + Shift + Escape),然後在分配這些字段時重新運行並檢查差異。

+0

我想知道的是當這些16位被分配時 - 在構造對象時或者在啓動字段時('size = 3;')。 – bancer

+0

您可以使用我建議的方式輕鬆測試它,如果我現在沒有更重要的工作要做,我會立即嘗試。我可能會在稍後發佈結果。 我想這也可能取決於如何配置JVM – dominicbri7

1

當創建對象時,存儲基元類型的Java類中的字段將使用默認值進行初始化,所以我會想象內存將被分配。

1

這是依賴於實現的。

早期的JVM實現更接近類文件格式。在這種情況下,byte,short,char,int,float和引用佔用一個時隙; longdouble兩個插槽。所以,有效地將大小調整爲四個字節,這就是它在對象中佔用的內存量。然後,對象的總數(包括頭部)通常會舍入爲8個字節,以便更好地進行內存對齊。對於「壓縮的oops」(64位平臺上的32位引用,其中64位地址的底部位始終爲零,允許引用被移位並使用超過4 GB,同時將引用保持爲4字節),那裏是強大的壓力,以適應更大的尺寸。

但是在十年的最佳時間裏,我們有64位的JVM。這意味着更多的浪費,包括處理器內存帶寬方面的浪費。所以在現代實現中,對象佈局被壓縮,使得對象使用盡可能多的內存(加上頭部和對齊舍入)。

+0

插槽只適用於本地變量而不是字段。一個64位的引用仍然只佔用一個插槽,並且與使用的內存量無關。特別是如果它們映射爲使用寄存器。 –

+0

@Peter Lawrey快速瀏覽JVM規範,似乎表明與本地人不同的字段不區分32位和64位類型。您可以在同一個本地空間中獲得兩個64位引用或整數,例如一個long或double。所以64位JVM在解釋字節碼時不會那麼簡單。 IIRC,這是改變對象內場的佈局的力量。 –

3

在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位,使爲原始的大小沒有差異,但它確實改變參考的默認大小。

相關問題