OutOfMemoryError - PullRequest
       25

OutOfMemoryError

1 голос
/ 07 января 2010

У меня есть один основной класс, который содержит 5 кнопок каждая ссылка на программу / пакет.Каждый пакет запускает программу jmf, которая захватывает изображения с веб-камеры, а также загружает около 15 изображений из файла.

Первая загружаемая программа (независимо от того, какую кнопку я нажимаю) всегда работает правильно.Но когда я запускаю программу после завершения 1-й программы, java.lang.OutOfMemoryError: происходит пространство кучи Java

Я не уверен, что java не может обрабатывать все наши изображения или имеет какое-то отношение к захвату изображений jmf.

Ответы [ 6 ]

3 голосов
/ 07 января 2010

Может быть, вам следует выделить больше памяти для JVM (-Xmx512m в командной строке может быть хорошим началом),

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

Может помочь использование инструментов диагностики солнца, таких как jvisualvm .

2 голосов
/ 07 января 2010

Увеличение максимальной памяти Java и повторный запуск. Если вы все еще видите OOM, у вас может быть утечка. Чтобы увеличить максимальный объем памяти, добавьте -Xmx<new heap size>m к командной строке.

Пример:

java -Xmx1024m Foo
1 голос
/ 07 января 2010

Сколько памяти вы отдаете своей JVM? Вы можете дать больше, используя следующее: -Xmx1024m (для 1 ГБ, отрегулируйте при необходимости)

Предполагается, что в вашей программе нет утечки памяти. Я ничего не знаю о JMF, это всего лишь общий совет для ошибок Out of Memory.

0 голосов
/ 07 января 2010

Java по умолчанию использует 64 МБ кучи. Альтернативой другим предложениям (увеличение пространства кучи до 512M или 1024M) является запуск отдельных JVM для контроллера и 5 приложений. Затем, если происходит сбой одного из ваших приложений JMF (из-за недостатка памяти), контроллер и другие приложения все еще работают.

(это будет работать только в том случае, если приложения и контроллер полностью отделены - в противном случае просто увеличьте размер кучи и утилизируйте все носители, как только они вам больше не понадобятся, чтобы предотвратить утечки памяти)

0 голосов
/ 07 января 2010

Попробуйте проверить, есть ли у вас какие-то ссылки, которые мешают сборке первого пакета / программы.

Когда средство запуска обнаружило, что первая программа завершилась, установите все ссылки на первую программу и, возможно, объекты, извлеченные из нее, в NULL, чтобы позволить JVM снова восстановить память и подготовить ее ко второму запуску.

0 голосов
/ 07 января 2010

JVM работают с ограниченным объемом доступной им максимальной памяти. Это немного нелогично и сбивает с толку многих людей (я не могу вспомнить много подобных сред).

Вы можете увеличить максимальный объем памяти, который занимает JVM, указав

java -Xmx128m ...

или аналогичный. Если вы заранее знаете, что собираетесь использовать этот объем памяти, используйте

java -Xms128m ...

для указания памяти, которую JVM будет выделять при запуске . Обратите внимание на -Xms против -Xmx!

...