Java类VS数组的内存大小?(Java class vs array memory size?)

2019-06-27 17:59发布

我有存储数百万X / Y双对在我的Java程序的参考。 我想保持内存消耗尽可能低以及对象引用的数量。 所以经过一番思考,我决定在一个很小的双列保持两个点可能是一个好主意,它的设置看起来像这样:

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

我想用数组将防止在类中使用的类和我的X和Y变量之间的联系,具体如下:

class Node {
     public double x, y;
}

在类的公共字段存储读入后一路然而,我明白了场实际上可能没有构造为类似的结构,也许是JVM简单地存储在连续内存中这些值的指针,并且知道如何找到他们没有地址从而使我的点比阵列小的类表示。

所以现在的问题是,它有一个更小的内存占用? 为什么?

我在课堂上的字段是否不使用指针,因此具有一个32位的开销,还是不特别感兴趣。

Answer 1:

后者具有较小的足迹。

原始类型内嵌存储在包含类。 所以,你的Node都需要一个对象头和两个64位插槽。 所指定的数组使用一个阵列头(> =目标首标)plust两个64位槽。

如果你要分配这样100个变量,那么也不要紧那么多,因为它只是头部大小这是不同的。

警告:这一切是有点投机因为你没有指定JVM - 其中的一些细节可以由JVM会有所不同。



Answer 2:

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

然而,一个数组,从根本上,是要走的路。 如果你想节省指针,使用一个维数组。 (有人已经说)。



Answer 3:

首先,必须指出的是,实际的空间使用情况取决于你所使用的JVM。 它是严格落实具体。 下面是一个典型的主流JVM。

所以现在的问题是,它有一个更小的内存占用? 为什么?

第二个版本是较小的。 阵列具有32位字段的对象头标持有数组的长度的开销。 在一个非阵列对象的情况下,该大小是在类隐式和不需要单独表示。

但是请注意,这是每个数组对象固定在头上。 阵列是越大,那么重要的开销是在实用性方面。 并使用类而不是数组的反面是索引将无法正常工作,你的代码可能会更复杂(慢)的结果。

一个Java 2D数组实际上和一维数组(等等)的阵列,这样你就可以将相同的分析具有较高空间的维度阵列。 的大小的阵列具有在任何维度越大,冲击少的开销了。 在塔顶2x10阵列将小于在10x2阵列。 (认为它通过... 1个阵列长度的2 + 2长度10 相对于 1个阵列长度的10 + 10长度为2的开销是正比于阵列的数目。)

我在课堂上的字段是否不使用指针,因此具有一个32位的开销,还是不特别感兴趣。

(你实际上是在谈论实例字段,而不是类字段,这些字段不是static ......)

字段,其类型是基本类型被直接存储在对象的堆节点没有任何引用。 有一个在这种情况下,没有指针的开销。

然而,如果该字段类型为包装器类型(例如Double而不是double ),那么有可能是一个参考的开销以及目标首标为的开销Double对象。



文章来源: Java class vs array memory size?