我正在从事一个涉及启发式的项目,我用 Java 构建了它(应该用 C 来构建)。 我遇到了内存问题。
我的树是用对象节点构建的,每个对象包含一个数组、一个矩阵和三个整数。 我已经削减了许多其他值,以尝试节省更多内存空间,但是,这仍然不够。
所以,我在想我也可以将矩阵进行切割,并将其转换为数组。 但是,我的整个项目都是建立在坐标上的,以达到矩阵中的某个点。 因此,在我进行任何更改之前,我想知道这会对内存使用产生多大(或不太大)的影响。
编辑:数组和矩阵均由 int 基元组成。
数组为array[25],矩阵为matrix[5][5]。
矩阵表示游戏的棋盘,包含该字段是否为空或是否有某种类型的棋子(均为 int)的信息。
我说的是 16GB 的 RAM 使用量和 2500 万个节点。
我做了这个方法,克隆数组:
public int[] cloneArray(int[] array){
int i = 0;
int[] clone = new int[array.length];
while (i < array.length){
clone[i] = array[i];
i++;
}
return clone;
}
我们采用了类似的方法来克隆矩阵和对象本身。
编辑: 在发现分析器的存在后,我进行了检查。 这是结果的屏幕截图:
我认为这些数字是有道理的,因为在控制台中,您可以看到与在分析器中看到的几乎一样多的节点数,状态(在控制台中,“estados”是状态指针目前正在扩展)。
因此,在分析器中,我们可以看到将近 20m 个状态,它们是生成的节点。 每个状态包含 1 个数组和 1 个矩阵。
我们可以看到138m的数组,除以6等于23m。 又因为一个矩阵是5x5,那么矩阵中包含5x23m的数组,另外23m是数组。
我说的有道理吗?这种解释准确吗?
这是一个保管箱链接,因此您可以查看全分辨率图像: https://www.dropbox.com/s/7wxz8vch1wnrsyr/Untitled.png?dl=0
最佳答案
举几个例子:
int[] array = new int[25];
int[][] matrix = new int[5][5];
数组占用的空间为:
- 25 x 4 字节整数(数组内容)
- 数组的 12 个字节的对象头
- 共 112 字节
Java中的二维int
矩阵其实就是一个数组的数组,所以矩阵占用的空间是
- (5 x 4 字节整数 + 12 字节数组头)x 5。
- 5 x 4 字节引用 + 12 字节数组头
- 共 192 字节
(上面假设一个 32 位 JVM 和典型数组头大小。这些是特定于平台的假设,但对于任何 JVM 平台,您应该能够将它们与特定性联系起来。对于 Oracle从 Java 6 开始的 HotSpot/OpenJDK JVM,源代码可供任何人查看。)
当然请注意,随着数组/矩阵变大,int[N^2]
相对于 int[N][N]
的相对节省变为更小。
关于java - Java 内存方面的数组与矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28083069/