2015-03-14 6 views
0

Исключение в потоке "основной" java.lang.OutOfMemoryError: Java куча пространстваOut Of Ошибка памяти: пространство кучи Java - Использование большого массива размера

Использование 2D массив [100000] [100000] и двух других массивов из [100000] каждый. Мне нужны эти три массива во всей программе, поэтому они не могут освободить их память.

Уже попробовал VM Options -Xmx512m в Netbeans

Пожалуйста, специфичны и шаг за шагом, я новичок в Java и Netbeans.

Заранее спасибо вам помочь ....

+1

Что такое тип массива, попробуйте запустить с -Xmx1200m (максимум окна xp) или почти до максимальной свободной памяти –

+0

Этот 2D-массив будет занимать 10 ГБ, если элементы байтов, 40 ГБ, если они ints ... Так что вам понадобится хотя бы 'element_size_in_bytes * 10' ГБ ОЗУ ... – emlai

+0

Вам просто нужно применить то, что вы узнали в арифметике: 100000 * 100000 = 10 миллиардов. Исходя из этих массивов байтов, это означает, что вам нужно 10 миллиардов байт, т. Е. 10 ГБ памяти. Ваш 512 МБ не будет сокращать его. –

ответ

4

Давайте делать некоторые математике. Вы выделяете двухмерный массив элементов размером 10 000 000 000, плюс еще два массива из 100 000 элементов.

Это 10 002 000 000 элементов. Если каждый из них является int, это 40 008 000 000 байт. Это 37.26 Giga байт.

-Xmx512m Ваш не достаточно близко, вам нужно что-то ближе к -Xmx60G, если это действительно Интс или -Xmx15G в лучшем случае, в котором элементы являются байтами (например, BOOLEANS). Но это, вероятно, не сработает, так как у вас (возможно) недостаточно физической памяти. Для меня это похоже на то, что вам нужно какое-то хранилище на диске или база данных.

Либо передумайте, что вы делаете, и как вы это делаете, либо используйте машину с такой физической памятью.

+0

Спасибо, Барт ... Понял, что ... Не думал так ... как обойти это? Я работаю над графиками с вершинами порядка 80 К, а затем нахожу кратчайший путь между двумя заданными вершинами. –

+0

@ManojPathak Если вы не можете поместить весь график в память, сохраните его на диске и каждый раз читайте только соответствующие фрагменты данных. Возможно, что-то вроде Neo4j (https://en.wikipedia.org/wiki/Neo4j). – Malt

+0

Спасибо за ваши предложения, они действительно полезны :-) –

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