Невозможно создать LinkedList переменных типа 7M Long в Java - PullRequest
1 голос
/ 03 мая 2011

Я пытаюсь создать очень большой связанный список, как показано ниже, но он не удался (запустился как модульный тест в maven. Уже установил размер кучи, запустив "set MAVEN_OPTS = -Xmx4096m" (я работаю в Windows).

Код не выполнен после вставки в список элементов длиной около 6 МБ (6000000). Почему? Учитывая, что тип Long имеет длину 8 байт, переменные типа 6M Long имеют длину всего 48 Мбайт. Даже если в Java-объекте есть дополнительные скрытые поля, это не должно провалиться так рано.

 int N = 100000000;

    try {

        LinkedList<Long> buffer = new LinkedList<Long> ();

        for(int i=0;i<N;++i) {
            buffer.add((long)i);

            if (i % 1000000 == 0) {
                System.out.println("added " + i);

            }
       }
   catch(Exception e)
   {...}

Ответы [ 3 ]

4 голосов
/ 03 мая 2011

Каждая запись в списке представляет собой отдельный объект со ссылкой на предыдущий и следующий узлы, а также на текущее значение.

Если предположить 8 байтов на ссылку и служебные данные объекта равны 16байт, это означает, что для каждой полученной вами записи:

  • Объект записи: 40 байт (3 ссылки + накладные расходы)
  • A Длинный объект: 24 байта (данные + накладные расходы)

Итак, после 6000000 записей это будет около 384M ... с которыми у вас все еще должно быть все в порядке.(В зависимости от вашей JVM, я бы ожидал, что размер ссылки и накладные расходы на объект также будут ниже.)

Интересно, установлен ли ваш MAVEN_OPTS в неправильном месте или не используется для аргументов JVMпо какой-то причине.Я только что попытался запустить это на своем Windows-боксе (не в качестве модульного теста - просто как main метод), и при выделении по умолчанию JVM он завершается неудачно после 6 миллионов записей для меня тоже.С -Xmx1024M получается 25 миллионов записей, что предполагает меньшие издержки, чем я оценивал выше.(Хотя я на 32-битной виртуальной машине.)

Это, безусловно, означает, что ваш MAVEN_OPTS не делает то, что вы хотите ...

2 голосов
/ 03 мая 2011

LinkedList - это самый неэффективный способ хранения серии длинных записей. У вас есть объект Long, который примерно в 3 раза больше простого длинного, и у вас есть запись linkList, которая имеет двойную связь, что делает его примерно в 5 раз больше простого длинного.

Я полагаю, вы используете long[] или оболочку типа TLongArrayList, которые используют почти 8 байт в длину для большой коллекции. (Тоже будет быстрее)

1 голос
/ 03 мая 2011

Не забывайте память, занятую

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