簡體   English   中英

Java類vs數組內存大小?

[英]Java class vs array memory size?

我必須在我的Java程序中存儲數百萬個X / Y雙對以供參考。 我想保持盡可能低的內存消耗以及對象引用的數量。 所以經過一番思考后,我決定將這兩個點放在一個很小的雙數組中可能是一個好主意,它的設置如下:

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

我認為使用數組會阻止類與我在類中使用的X和Y變量之間的鏈接,如下所示:

class Node {
     public double x, y;
}

然而,在閱讀了類中公共字段的存儲方式后,我突然意識到字段實際上可能不是像指針一樣構造結構,也許JVM只是將這些值存儲在連續的內存中並且知道如何在沒有地址的情況下找到它們使我的點的類表示小於數組。

所以問題是,內存占用量更小? 為什么?

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

后者占地面積較小。

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

如果您要以這種方式分配100個變量,那么它並不重要,因為它只是不同的標題大小。

警告:所有這些都有些推測,因為你沒有指定JVM - 其中一些細節可能因JVM而異。

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

但是,從根本上說,陣列是要走的路。 如果要保存指針,請使用一維數組。 (有人已經說過)。

首先,必須說明實際的空間使用量取決於您使用的JVM。 它嚴格針對具體實施。 以下是典型的主流JVM。

所以問題是,內存占用量更小? 為什么?

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

但請注意,這是每個數組對象的固定頂部。 陣列越大,實際開銷就越不重要。 而使用類而不是數組的另一方面是索引不起作用,因此您的代碼可能會更復雜(和更慢)。

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

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

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

類型為基本類型的字段直接存儲在對象的堆節點中,而不進行任何引用。 在這種情況下沒有指針開銷。

但是,如果字段類型是包裝類型(例如Double而不是double ),則可能存在引用的開銷和Double對象的對象標頭的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM