Java 从任何类中读取和写入的矩阵

Java 从任何类中读取和写入的矩阵,java,matrix,Java,Matrix,我正在运行一个包含60多个类的Java程序。最重要的项目是一个矩阵[210][20],它可以从几个不同的类中读取和写入。 此时,矩阵作为参数传递给需要访问它的类。据我所知,我相信这会导致该矩阵的内存空间增加一倍。 现在我需要再添加3个更大的矩阵([1390][20]),所以我担心会遇到麻烦(此时的内存使用率已经是+/-50%!)。 我确信应该有更好的方法来处理这个问题,我环顾四周,尝试了一下,但总是被卡住,无法正确处理。 请告知 在Java中,方法参数(至少是对象)是通过引用传递的,因此您的设计

我正在运行一个包含60多个类的Java程序。最重要的项目是一个
矩阵[210][20]
,它可以从几个不同的类中读取和写入。

此时,矩阵作为参数传递给需要访问它的类。据我所知,我相信这会导致该矩阵的内存空间增加一倍。
现在我需要再添加3个更大的矩阵(
[1390][20]
),所以我担心会遇到麻烦(此时的内存使用率已经是+/-50%!)。
我确信应该有更好的方法来处理这个问题,我环顾四周,尝试了一下,但总是被卡住,无法正确处理。
请告知

在Java中,方法参数(至少是对象)是通过引用传递的,因此您的设计模式不一定会导致资源泄漏。但是,您可以使用静态字段存储变量并写入静态访问器:

public final class Matrix {

    private static final Object[][] matrix = new Object[1390][20];

    static {
        // fill matrix if necessary
    }

    public static Object[][] getMatrix() {
        return matrix;
    }

}

然后在代码中使用
Matrix.getMatrix()
。请记住,如果您从不同的线程访问矩阵,这可能会导致问题。

Veronique,我认为查看矩阵时,您看到的位置不对

正如我提到的,一个双精度矩阵不应该占用过多的空间

即使它是一个由对象组成的矩阵,你还是最好看看对象本身,而不是矩阵,也许可以使用类似于矩阵的东西

在这一点上,我认为最好的办法是实际检查程序运行时发生的情况,而不是根据自己的分析进行猜测

为此,您应该使用类似的工具进行研究,该工具应该可以非常快地暴露出这种规模的内存消耗热点


仅供参考java内存泄漏的一个常见原因是对
集合中挂起的旧对象的引用,例如
Map
List
,因此我建议您检查一下。还可以查看您是否正在创建矩阵对象的重复实例(实际上,在复制了几千个副本之后,内存会很快耗尽:)。

是否可以使矩阵成为静态的(或提供静态getter方法),这样您就可以访问它而无需将其作为参数传递?“据我所知,我相信这会使矩阵的存储空间增加一倍。“-您对对象和引用了解多少?矩阵中的值有多大?1390*20长值矩阵应该只占217kb左右,除非在受约束的环境中运行,否则这不会是问题。icke:矩阵值在程序运行期间会发生变化,因此静态不是选项;伊米比斯:显然还不够;罗伯特:值是双精度的。@Veronique
static
并不意味着
final
<代码>静态
仅表示该字段不属于一个实例,而是在类的所有实例之间共享<代码>最终表示无法重新分配字段。但是您可以重新分配一个
静态
字段。这是不必要的,因为这些值是通过引用传递的,而不是通过值传递的。除非显式复制,否则应该只有一个副本。谢谢Robin,但我不能使用静态原因矩阵值一直在更改。我也有不同的线程,虽然我应该能够管理它,使每个线程只使用一个矩阵,并且只使用另一个线程当前未使用的矩阵。@Veronique您可以更改静态字段的值。我认为您不能从静态方法访问实例字段。我想你想让这个数组是静态的。我的程序的堆只有17MB,我有其他的开放java应用程序,它们占用了更多的空间,所以我想我不应该担心我自己的应用程序,正如你已经提到的。无论如何,感谢您的帮助,这个jvisualvm是一个很好的工具!