有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数组无法解释的“OutOfMemoryError:Java堆空间”错误和代码行为

我已经编写了这段非常简单的代码,它采用双点坐标数组并添加它们的中点。在执行时,我不断地得到OutOfMemoryError: Java heap space,有时甚至得到OutOfMemoryError: GC overhead limit exceeded。唯一能让它工作的是,如果我在末尾添加一个if-else语句,它将删除所有长度超过1000的新数组。当我使用这个if-else语句时,我只是想解释一下,但是现在我更困惑了,因为被解析的数组没有一个大于500(并且输出数组总是length * 2 - 1)。我已经尝试尽可能地增加堆空间,直到我的计算机崩溃,它没有改变任何东西。我真的看不出我的代码有什么问题,我已经看了好几个小时了

非常感谢,任何帮助都将不胜感激

    public float[][] smooth(float a[][]){
        int length = a.length;
        float b[][] = new float[(length*2)-1][2];
        int x = 0;

        for (int i = 0; i < length; ++i){
            b[i+x] = a[i];
            x += 1;
            if (i < length-1)
                b[i+x] = midPoint(a[i], a[i+1]);
        }

//      if (b.length < 1000)
            return b;
//      else
//          return a;
    }

    public static float[] midPoint(float a[], float b[]){
        int length = a.length;
        float c[] = new float[length];

        for(int i = 0; i < length; ++i)
            c[i] = (a[i] + b[i])/length;

        return c;
    }
}

主要类别:

import java.lang.*;
import java.io.*;
import java.util.*;
import hwr.*;

public class DTWDist {
public static void main(String[] args) {

    MyClass2 mc2 = new MyClass2();

    if (args.length != 2) {
        System.out.println("Perform dynamic time warping alignment on reference patterns");
        System.out.println("usage: input_list ref_list");
        System.out.println("output format: input_id ref_id distance");
        System.exit(-1);
    }

    TimeWarping warpFun = new DynamicTimeWarping(new SquaredEuclidDistance());
    float input_pats[][][];
    float ref_pats[][][];
    PenDataReader reader = new PenDataReader(true);
    input_pats = reader.readFileList(args[0]);
    ref_pats = reader.readFileList(args[1]);

    for (int i = 0; i < input_pats.length; ++i){
        for (int j = 0; j < ref_pats.length; ++j){

            input_pats[i] = mc2.smooth(input_pats[i]);
            ref_pats[j] = mc2.smooth(ref_pats[j]);
            input_pats[i] = mc2.centroid(input_pats[i]);
            ref_pats[j] = mc2.centroid(ref_pats[j]);
        }
    }

    for (int i = 0; i < input_pats.length; ++i) {
        for (int j = 0; j < ref_pats.length; ++j) {

            System.out.println(i + " " + j + "\t" + warpFun.calcDistance(input_pats[i], ref_pats[j]));
        }
        System.out.println();
    }
    System.out.println();
}
}

共 (2) 个答案

  1. # 1 楼答案

    我已经用相对较小的数组大小测试了这段代码,并且运行良好。因此,需要知道正在使用的数组大小和堆设置

  2. # 2 楼答案

    声明“b”数组后,没有任何内容会修改该数组的大小。因此,您必须传入一个大小大于500的数组“a”

    将if语句放回,并在其中放置一个断点以进行调试。我怀疑一旦你这么做了,事情会很快变得明朗

    编辑:从我所看到的问题几乎可以肯定是在调用smooth方法的代码中