数组无法解释的“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();
}
}
# 1 楼答案
我已经用相对较小的数组大小测试了这段代码,并且运行良好。因此,需要知道正在使用的数组大小和堆设置
# 2 楼答案
声明“b”数组后,没有任何内容会修改该数组的大小。因此,您必须传入一个大小大于500的数组“a”
将if语句放回,并在其中放置一个断点以进行调试。我怀疑一旦你这么做了,事情会很快变得明朗
编辑:从我所看到的问题几乎可以肯定是在调用smooth方法的代码中