java.lang.OutOfMemoryError:分配数组大小时的Java堆空间

时间:2013-10-26 06:37:19

标签: java heap out-of-memory

我使用Eclipse Kepler IDE在java中执行非常小的程序。

我使用以下语句在运行时分配数组的大小。

unSortedArray = new int[sizeRow][sizeColumn];

据我所知,java程序运行时有一些自己的堆空间,如32 MB。

对于我的程序,我认为这个空间已经足够了。

我刚刚在运行时给出了值sizeRow=3sizeColumn=3

当我按下输入时,会出现以下异常 java.lang.OutOfMemoryError: Java heap space

我提出这个问题,以了解它为什么会发生以及我们如何处理它?<​​/ p>

我已阅读以下链接。

java.lang.OutOfMemoryError: Java heap space

How to deal with "java.lang.OutOfMemoryError: Java heap space" error (64MB heap size)

修改:1

public class ArraySort
{
private int[][]                 unSortedArray;
private int                     sizeColumn, sizeRow;

private final DataInputStream   dataInputStream = new DataInputStream(
                                                        System.in);

public boolean getArraySize() throws IOException
{
    try
    {
        System.out.print("Enter the size of the row:");
        sizeRow = (dataInputStream.readInt());
        System.out.print("Enter the size of the column:");
        sizeColumn = dataInputStream.readInt();
        return false;
    }
    catch (NumberFormatException e)
    {
        System.out.println("Enter valid value for size:");
    }
    return true;
}

public boolean getArrayElement() throws IOException
{
    unSortedArray = new int[sizeRow][sizeColumn];
    for (int i = 0; i < sizeRow; i++)
    {
        for (int j = 0; j < sizeColumn; j++)
        {
            try
            {
                System.out.println("Enter Element [" + i + "," + j + "]");
                unSortedArray[i][j] = dataInputStream.readInt();
            }
            catch (NumberFormatException ne)
            {
                System.out
                        .println("Enter proper Numeric value for Array Element");
                return true;
            }
        }
    }
    return false;
}
}


public class ArraySortProgram
{

public static void main(String[] args) throws IOException
{
    ArraySort arraySort = new ArraySort();

    arraySort.getArraySize();
    arraySort.getArrayElement();
}
}

在我的情况下,我只调用这些方法一次。

2 个答案:

答案 0 :(得分:2)

问题在于:

dataInputStream.readInt()

这将读取您输入的二进制值,如果输入的“1251”导致OOM,则为2323827382。

尝试使用Scanner来读取这样的整数:

public class ArraySort{
    private final Scanner scanner = new Scanner(System.in);

    int sizeRow, sizeColumn;

    public boolean getArraySize() throws IOException
    {
        try
        {
            System.out.print("Enter the size of the row:");
            sizeRow = (scanner.nextInt());
            System.out.print("Enter the size of the column:");
            sizeColumn = scanner.nextInt();
            return false;
        }
        catch (NumberFormatException e)
        {
            System.out.println("Enter valid value for size:");
        }
        return true;
    }    
    ...
}

答案 1 :(得分:1)

如果违规代码如您所示,那么有可能:

  • 在执行此语句之前,您已经分配了其他对象,并且您已经消耗了几乎所有可用空间的。这句话是打破骆驼背后的谚语。

  • sizeRowsizeColumn的值不是您认为的值。

如果不了解更多代码,我们无法区分这两种可能性。


更新 - 安德烈根据您更新的代码发现了问题。您正在错误地读取尺寸,导致尺寸值不正确/非常大。这导致您的应用程序尝试分配一个巨大的数组数组......这给了OOME。