线程“main”中的异常java.lang.OutOfMemoryError:eclipse中的Java堆空间

时间:2015-07-29 05:13:09

标签: java xls

您好我正在从.xls表中读取包含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;       
}

3 个答案:

答案 0 :(得分:5)

目前这一行:

doubleArray = new double[data1.size()][data2.size()];

正在创造8500 x 8500双打,超过500MB。 你基本上分配的空间足够8500和8500列。

但是看到你在算法中只使用了其中两列:

doubleArray[i][0] = (Double)data1.get(i);
doubleArray[i][1] = (Double)data2.get(j);

我怀疑你真的想要创建那么多列。 鉴于您的剩余算法,此分配应满足您的需求:

doubleArray = new double[data1.size()][2];

答案 1 :(得分:1)

在你的java文件中,你必须使用double []数组。我认为你没有声明数组的正确大小

答案 2 :(得分:0)

你缺少堆空间。您的程序的默认堆空间不足。您需要使用-Xms-Xmx标志来增加堆空间。

-Xms标志以指定最小堆空间。 -Xmx标志以指定最大堆空间。

例如:

java -Xms512m -Xmx1024m YourMainClassName  

将最小堆空间设置为512 MB,最大堆空间设置为1024 MB。

此处更多参考:http://www.mkyong.com/java/find-out-your-java-heap-memory-size/