2013-10-04 2 views
3

я должен использовать long массив с диапазоном индекса от 0 до 33554432.Сколько индексов может поддерживать длинную массив в Java?

Это дает ошибку:

"Exception in thread main java.lang.OutOfMemoryError: Java heap space". 

short В то время как массив не дает эту ошибку. Я должен использовать массив long и те же индексы, что я могу сделать?

+1

Вы можете попробовать [увеличение кучи Java] (http://stackoverflow.com/a/1566026/2071828), но обратите внимание, что 'short' составляет 16 бит, а' long' - 64 бит, вам требуется _a lot_ больше места. –

+3

Из * Memory * - это не то, что Array * не может содержать столько элементов, просто потому, что JVM не может создать/выделить массив, большой по текущей системе (с предоставленными параметрами JVM). – user2246674

+3

Вам действительно нужно хранить 33 миллиона значений в этих массивах? Или большинство ячеек будет пустым? Рассмотрим использование карты, где ключ является числовым индексом. – Kenster

ответ

2

Дальность действия массива должна быть в пределах максимального значения int.

По JLS

Массивы должны быть индексированы Int значений. Попытка доступа к компоненту массива с длинным индексом приводит к ошибке времени компиляции.

+1

С каких это пор 2^31-1 <33554432? У него просто не хватает памяти, и ему нужно настроить максимальный размер кучи на '-Xmx' –

+0

спасибо Thomas Jungblut –

5

Индексы массива - это int. Вы получаете OOM, поскольку размер кучи по умолчанию слишком мал. Попробуйте запустить java с параметром командной строки -Xmx512m (так как вашему массиву уже требуется 8 * 33554432 = 268435456, 268 МБ)

6

Вы можете получить намек на то, что доступ к массивам осуществляется с использованием целочисленных литералов. Так как числовые литералы достигают Integer.MAX_VALUE, это количество индексов (и элементов), которое может иметь ваш массив. arshajii brings up another hint.

Ваша проблема связана только с тем, что вашему приложению недостаточно памяти, чтобы создать много long s, но этого достаточно, чтобы создать много short s. Помните, что когда инициализируется массив, его элементы также инициализируются значением по умолчанию. Для примитивных типов это значение равно 0 или 0.0. Что следует учесть (в зависимости от среды)

Long[] array = new Long[33554432]; // allocation would work 
long[] array = new long[33554432]; // allocation would fail 

Это потому, что ссылочные типы инициализируются null ссылки и поэтому только ссылка занимает пространство. Таким образом, вы можете начать добавлять элементы, но это также в конечном итоге потерпит неудачу.

Запустите приложение с большей памятью.

+1

+1 Вы также можете получить намек на то, что поле' length' является 'int'. – arshajii

Смежные вопросы