2010-12-29 3 views
0

Я написал код, и я хочу передать несколько списков разного размера, но когда размер моего списка превышает 1024, он будет генерировать исключение ниже! как я могу справиться с этим?Ошибка памяти

size, running time for x 

2,184073 
3,98308 
5,617257 
9,481714379 
17,55230 
33,64505 
65,41094 
129,65120 
257,102555 
513,197511 
1025,465897 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at OBSTclasses.MemoizedVersion.<init>(MemoizedVersion.java:33) 
     at OBSTclasses.Coordinator.main(Coordinator.java:102) 
Java Result: 1 

, а также линия, которая бросает это исключение:

 minAverageTimeArray = new double[array.size()][array.size()]; 

благодарит

+0

Также я использую netbeans IDE 6.7 – user472221

+0

Из этих подсказок я могу только сказать, что вам следует увеличить угасание изменения вашего алгоритма. – pinichi

ответ

2

Это кажется, что вам нужно увеличить максимальный объем памяти, который может использовать ваш Java-процесс. Добавьте к вашему java-вызову параметр -Xmx512m, где 512m - 512 мегабайт.

3

Как malfy's answer упоминает, если один сталкивается с OutOfMemoryError, помимо найти способ использовать меньше памяти, увеличивая пространство кучи, говоря JVM выделить больше памяти для кучи один способ справиться с ситуацией.

В общем случае не следует выполнять обработку ошибок с Error, например OutOfMemoryError. Error, в отличие от Exception, является условием, выдаваемым JVM, который отмечает, что возникла проблема, которая является фатальной для JVM, что не может быть действительно «обработано» самой программой.

От Java API Specification for the Error класса:

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

Таким образом, чтобы ответить на этот вопрос кратко, вы не должны быть обработки OutOfMemoryError ошибка, но найти способы, чтобы избежать этого Error от происходящих в первую очередь.

0

Возможные причины OutOfMemory ошибки может быть утечка памяти
Решение: Увеличение размера кучи с помощью следующей команды

Usage :: java -Xms<initial heap size> -Xmx<maximum heap size>
Defaults are:java -Xms32m -Xmx128m
Other values might be java -Xms128m -Xmx512m
-Xms - Initial Heap Size.
-Xmx - Extended(Maximum) Heap Size. m-megabytes

0

Как coobird сказал никогда не обрабатывать ошибки в Java. Вы можете использовать MAT (Memory Analyzer - http://www.eclipse.org/mat/), чтобы проверить, действительно ли у вас есть какая-либо утечка памяти, или только то, что память кучи меньше для JVM. В случае утечки памяти вы можете оптимизировать объем памяти, используя результат MAT. Кроме того, вы можете увеличить размер кучи, как уже упоминалось выше многими друзьями.

0

Да, это ваше кучевое пространство в порядке. По умолчанию Java выделяет 128 Мбайт кучи на большинстве платформ. Вы должны учитывать максимальный размер списка, который вы хотите обработать, и, следовательно, сколько памяти вам нужно. Подумайте об этом так: переменная типа double в Java обычно имеет длину 8 байтов. Если ваши списки имеют длину 1024 элемента, тогда вашему 2D-массиву потребуется 8 * 1024 * 1024 байта или 8 МБ пространства кучи только для самого массива. Теперь, если ваши списки удваиваются по длине, вам понадобится в четыре раза больше кучи (32 МБ), и если они снова удвоятся (4096 предметов), вам понадобятся все 128 МБ вашего кучного пространства!Это, конечно, игнорирует всю кучу, используемую другими объектами, созданными вашей программой.

Итак, у вас есть несколько ответов. Как говорили другие, проще всего увеличить максимальную кучу, которую будет использовать экземпляр JVM. Вы также должны подумать о том, чтобы сократить объем памяти вашей программы в любой момент времени. Имеются ли промежуточные суммы или средние значения, которые вы можете вычислить, без необходимости хранить все свои данные? Или вы можете избавиться от необходимости хранить свои данные в виде списка и массива? Можете ли вы снизить точность ваших данных - будут ли плавающие или целые числа такими же точными, как удвоения для вашего приложения?

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