2012-09-03 47 views
9

我必須在我的Java程序中存儲數百萬個X/Y雙精度對以供參考。我想盡可能降低內存消耗以及對象引用的數量。所以經過一番思考,我決定在一個很小的雙列保持兩個點可能是一個好主意,它的設置看起來像這樣:Java類與數組內存大小?

double[] node = new double[2]; 
node[0] = x; 
node[1] = y; 

我想用數組將防止類和我的X和之間的聯繫在課堂上使用Ÿ變量,如下所示:

class Node { 
    public double x, y; 
} 

但是在類的公共字段存儲讀入的方式後,我恍然大悟,表格中實際上可能沒有構造爲狀結構的指針,也許是JVM是隻需將這些值存儲在連續的內存中,並知道如何在沒有地址的情況下找到它們,從而使我的點的類表示比陣列小。

所以問題是,它有一個較小的內存佔用?爲什麼?

我特別感興趣的是類字段是否使用指針,因此有32位開銷,或者不是。

回答

5

後者佔地面積較小。

原始類型以內聯方式存儲在包含類中。所以你的Node需要一個對象頭和兩個64位插槽。您指定的數組使用一個數組標題(> =一個對象標題)plust兩個64位插槽。

如果你打算以這種方式分配100個變量,那麼它並不重要,因爲它只是不同的標題大小。

警告:由於您沒有指定JVM,所有這些都是有點推測的 - 其中一些細節可能因JVM而異。

+0

目前在Mac OS X上在x64上運行Java 1.7 SE。現在我假設一個巨大的2D數組將完全消除每個節點的必要對象引用,因此這將是迄今爲止最保守的內存方式? –

+0

如果使用2D,則表示double [2] [n]或double [n] [2],這也會導致對象引用。因爲在這種情況下,java中的數組真的是數組的陣列 –

+0

(您可能會過度優化此操作,但是......)最小內存佔用量將是一個一維數組,您可以在其中明確計算索引。 Java中的2D數組只是指向1D數組的指針數組。 –

0

我不認爲你最大的問題是要存儲數據,我認爲這將是檢索,索引和操縱它。

然而,從根本上來說,數組是一條路。如果您想保存指針,請使用一維數組。 (有人已經說過了)。

0

首先,必須說明實際空間使用情況取決於您使用的JVM。嚴格執行具體。以下是典型的主流JVM。

所以問題是,它有一個較小的內存佔用?爲什麼?

第二個版本更小。一個數組具有保存數組長度的對象頭中的32位字段的開銷。在非數組對象的情況下,大小隱含在類中,不需要單獨表示。

但是請注意,這是一個固定的高位每個數組對象。數組越大,實際開銷就越小。而使用類而不是數組的反面是索引不起作用,因此你的代碼可能更復雜(並且更慢)。

Java 2D數組實際上是1D數組(等等)的數組,因此您可以將相同的分析應用於維數更高的數組。數組的大小越大,開銷就越小。 2x10陣列中的開銷將小於10x2陣列中的開銷。 (認爲​​它通過... 1個陣列長度的2 + 2長度10 的對比 1陣列長度的10 + 10長度爲2的開銷是正比於陣列的數目。)

I」 m特別感興趣的是類字段是否使用指針,並且因此具有32位開銷,或者不是。

(你實際上是在談論實例字段,而不是類字段,這些字段是不是static ...)

字段,其​​類型是基本類型直接存儲在該對象的堆節點,而任何參考。在這種情況下沒有指針開銷。

然而,如果該字段類型爲包裝器類型(例如Double而非double)然後有可能是一個參考的開銷以及目標首標用於Double對象的開銷。

+0

這很清楚我的原始問題,謝謝! –