java - Java 内存方面的数组与矩阵

标签 java c arrays matrix

我正在从事一个涉及启发式的项目,我用 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;
}

我们采用了类似的方法来克隆矩阵和对象本身。

编辑: 在发现分析器的存在后,我进行了检查。 这是结果的屏幕截图: Java profiler stats

我认为这些数字是有道理的,因为在控制台中,您可以看到与在分析器中看到的几乎一样多的节点数,状态(在控制台中,“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/

相关文章:

c - 完美号码检查

c - 如何在 Linux 内核中生成 "artificial"中断?

Python:使用列表理解生成对称数组

python - 如何在 Numpy 中重写双 for 循环以节省执行时间?

javascript - 将 Javascript 数组转换为可读字符串

java - 如何返回 GetMapping 路径 id 的对象

java - Java HTTP 服务器

java - 错误和线程

java - android geocoder api 10 服务不可用

c - 为什么 printf() 在使用指针时绕过分段失败?