Java类vs数组内存大小?

我必须在我的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而异。

我不认为你最大的问题是存储数据,我认为这将是检索,索引和操纵它。

但是,从根本上说,arrays是要走的路。 如果要保存指针,请使用一维数组。 (有人已经说过了)。

首先,必须说明实际的空间使用量取决于您使用的JVM。 它严格针对具体实施。 以下是典型的主流JVM。

所以问题是,内存占用面积更小? 为什么?

第二个版本更小。 数组具有对象头中32位字段的开销,该字段保存数组的长度。 对于非数组对象,大小隐含在类中,不需要单独表示。

但请注意,这是每个数组对象的固定顶部。 arrays越大,实际上开销越不重要。 而使用类而不是数组的另一方面是索引不起作用,因此您的代码可能会更复杂(也更慢)。

Java 2Darrays实际上是一维数组(等等)的数组,因此您可以将相同的分析应用于具有更高维度的数组。 数组在任何维度上的大小越大,开销的影响就越小。 2x10arrays中的开销将小于10x2arrays中的10x2 。 (想一想……长度为10的长度为2 + 2的1个数组,长度为2的长度为10 + 10的1个数组。开销与数组的数量成正比。)

我对类字段是否使用指针特别感兴趣,因此具有32位开销。

(您实际上是在谈论实例字段,而不是类字段。这些字段不是static ……)

类型为基本类型的字段直接存储在对象的堆节点中,而不进行任何引用。 在这种情况下没有指针开销。

但是,如果字段类型是包装类型(例如, Double而不是double ),则可能存在引用的开销以及Double对象的对象标头的开销。