OutOfMemoryError в массиве 10000x10000 int в затмении - PullRequest
0 голосов
/ 11 августа 2011

Я написал небольшую программу для проверки времени цикла по двумерному массиву по строкам или столбцам, поскольку я помнил, что один способ был намного быстрее для больших наборов данных, но я не мог вспомнить, каким образом.Я столкнулся с интересной ошибкой, когда я запустил свою программу, хотя.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at testing.ForLoopTest.main(ForLoopTest.java:10)

Теперь в моем тесте я использую int [10000] [10000], запущенный в eclipse с настройками кучи по умолчанию.Я знаю, что могу увеличить размер кучи, но моя интуиция говорит мне, что все должно работать нормально, и мне это не нужно.Это нормально?Есть ли в моем коде что-то глупое, чего я не вижу?

Вот мой код

public static void main(String[] args){
    final int arrSize = 10000;
    long start = 0;
    long rowFirstTime = 0;
    long colFirstTime = 0;
    int[][] arr = new int[arrSize][arrSize];

    start = System.currentTimeMillis();
    for(int x = 0; x < arrSize; x++){
        for(int y = 0; y < arrSize; y++){
            arr[x][y] = -1;
        }
    }
    rowFirstTime = System.currentTimeMillis() - start;
    start = System.currentTimeMillis();
    for(int y = 0; y < arrSize; y++){
        for(int x = 0; x < arrSize; x++){
            arr[x][y] = 0;
        }
    }
    colFirstTime = System.currentTimeMillis() - start;
    System.out.println("row time is " + rowFirstTime);
    System.out.println("col time is " + colFirstTime);
}

Ошибка происходит при инициализации массива, она не попадает в циклы for.

Спасибо, zdevex

Ответы [ 5 ]

5 голосов
/ 11 августа 2011

Вы пытаетесь выделить память для 10 000 массивов длиной 10 000. Для этого требуется много памяти (около 400 МБ, по предварительным подсчетам), которая недоступна в вашей JVM.Это вызывает OutOfMemoryError.

Попытка увеличить объем памяти, выделенной вашей JVM в аргументах выполнения.Вы смотрите на что-то вроде -Xmx аргумента.Попробуйте дать ему значение больше 400 МБ.Я думаю, что вы можете изменить это значение в свойствах проекта в Eclipse.

2 голосов
/ 11 августа 2011

10 000 * 10 000 * 4 байта = 400 000 000

Нет, эти 400 миллионов байтов не поместятся в пространство кучи по умолчанию!

0 голосов
/ 11 августа 2011

Int занимает 4 байта.

10000 * 10000 * 4 байта = 400000000 байтов ~ = 381 МБ. И вы должны добавить размер взятых массивов.

Если ваш размер кучи меньше этого, вам нужно увеличить размер кучи.

0 голосов
/ 11 августа 2011

Давайте посмотрим ... 10000 раз 10000 = 100 000 000.Четыре байта на целое число дают вам 400 000 000 байтов.Плюс некоторые накладные расходы для 10000 элементов массива.Вы думаете, что выделение половины гигабайта должно "нормально работать", ничего не делая с размером кучи?

0 голосов
/ 11 августа 2011

Я думаю, что ваше внутреннее чувство неверно, и что 10000 * 10000 * (размер целых) байтов больше, чем размер кучи по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...