Exception in thread "main" java.lang.OutOfMemoryError: Java heap space in eclipse
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space in eclipse
您好,我正在从 .xls
sheet 读取数据,它包含 8500
行数据,我正在尝试将其存储在 double[][]
中,但我收到错误
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
代码
public static double[][] getData_DoubleArray(String path, int sheetNo, int rowIndex1, int rowIndex2) {
double[][] doubleArray=null;
try {
HSSFSheet sheet = PS_ExcelReader.getWorkSheet(path,sheetNo);
System.out.println("sheet" + sheet);
List<Object> data1 = PS_ExcelReader.getFullColumnByIndex(sheet, rowIndex1);
List<Object> data2 = PS_ExcelReader.getFullColumnByIndex(sheet, rowIndex2);
doubleArray = new double[data1.size()][data2.size()];
for(int i = 0; i < data1.size(); i++) {
for(int j = 0; j < data2.size(); j++) {
doubleArray[i][0] = (Double)data1.get(i);
doubleArray[i][1] = (Double)data2.get(j);
}
}
System.out.println("array " + Arrays.deepToString(doubleArray));
}
catch(IOException ioe) {
log.error("data mis match");
}
return doubleArray;
}
当前这一行:
doubleArray = new double[data1.size()][data2.size()];
正在创建 8500 x 8500 双打,超过 500MB。
您基本上为 8500 行和 8500 列分配了足够的 space。
但是看到您在算法中只使用了其中的 2 列:
doubleArray[i][0] = (Double)data1.get(i);
doubleArray[i][1] = (Double)data2.get(j);
我怀疑您是否真的想要创建那么多列。
考虑到您的剩余算法,此分配应该可以满足您的需求:
doubleArray = new double[data1.size()][2];
您的堆不足 space。默认堆 space 对您的程序来说不够用。您需要使用 -Xms
或 -Xmx
标志来增加堆 space。
-Xms
标志以指定最小堆 space。
-Xmx
指定最大堆的标志 space。
例如:
java -Xms512m -Xmx1024m YourMainClassName
会将最小堆 space 设置为 512 MB,将最大堆 space 设置为 1024 MB。
更多参考:http://www.mkyong.com/java/find-out-your-java-heap-memory-size/
在您的 java 文件中,您必须使用双精度 [] 数组。我认为您没有为数组声明正确的大小
您好,我正在从 .xls
sheet 读取数据,它包含 8500
行数据,我正在尝试将其存储在 double[][]
中,但我收到错误
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
代码
public static double[][] getData_DoubleArray(String path, int sheetNo, int rowIndex1, int rowIndex2) {
double[][] doubleArray=null;
try {
HSSFSheet sheet = PS_ExcelReader.getWorkSheet(path,sheetNo);
System.out.println("sheet" + sheet);
List<Object> data1 = PS_ExcelReader.getFullColumnByIndex(sheet, rowIndex1);
List<Object> data2 = PS_ExcelReader.getFullColumnByIndex(sheet, rowIndex2);
doubleArray = new double[data1.size()][data2.size()];
for(int i = 0; i < data1.size(); i++) {
for(int j = 0; j < data2.size(); j++) {
doubleArray[i][0] = (Double)data1.get(i);
doubleArray[i][1] = (Double)data2.get(j);
}
}
System.out.println("array " + Arrays.deepToString(doubleArray));
}
catch(IOException ioe) {
log.error("data mis match");
}
return doubleArray;
}
当前这一行:
doubleArray = new double[data1.size()][data2.size()];
正在创建 8500 x 8500 双打,超过 500MB。 您基本上为 8500 行和 8500 列分配了足够的 space。
但是看到您在算法中只使用了其中的 2 列:
doubleArray[i][0] = (Double)data1.get(i);
doubleArray[i][1] = (Double)data2.get(j);
我怀疑您是否真的想要创建那么多列。 考虑到您的剩余算法,此分配应该可以满足您的需求:
doubleArray = new double[data1.size()][2];
您的堆不足 space。默认堆 space 对您的程序来说不够用。您需要使用 -Xms
或 -Xmx
标志来增加堆 space。
-Xms
标志以指定最小堆 space。
-Xmx
指定最大堆的标志 space。
例如:
java -Xms512m -Xmx1024m YourMainClassName
会将最小堆 space 设置为 512 MB,将最大堆 space 设置为 1024 MB。
更多参考:http://www.mkyong.com/java/find-out-your-java-heap-memory-size/
在您的 java 文件中,您必须使用双精度 [] 数组。我认为您没有为数组声明正确的大小