Как справиться с ошибкой "java.lang.OutOfMemoryError: Java heap space" ошибка?

Я пишу клиентское приложение Swing (графический дизайнер шрифтов) на Java 5. Недавно я столкнулся с ошибкой java.lang.OutOfMemoryError: Java heap space из-за неаккуратного использования памяти. Пользователь может открывать неограниченное количество файлов, и программа хранит открытые объекты в памяти. После беглого исследования я нашел Ergonomics in the 5.0 Java Virtual Machine и другие статьи, в которых говорится, что на Windows-машине JVM по умолчанию устанавливает максимальный размер кучи 64MB.

Как мне поступить в данной ситуации?

Я мог бы увеличить максимальный размер кучи с помощью опции командной строки в java, но это потребовало бы выяснения доступной оперативной памяти и написания некоторой программы или скрипта запуска. Кроме того, увеличение до какого-то бесконечного максимума не в конечном счете избавит от проблемы.

Я мог бы переписать часть своего кода, чтобы часто сохранять объекты в файловой системе (использование базы данных - то же самое), чтобы освободить память. Это может сработать, но, скорее всего, тоже потребует больших усилий.

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

Комментарии к вопросу (2)
Решение

В конечном счете, независимо от платформы, на которой вы работаете, у вас всегда есть ограниченный максимальный объем кучи. В Windows 32 bit это около 2 ГБ (не конкретно куча, а общий объем памяти на процесс). Так получилось, что Java решила сделать его меньше по умолчанию (предположительно для того, чтобы программист не мог создавать программы с беглым распределением памяти, не сталкиваясь с этой проблемой и не проверяя, что именно он делает).

Таким образом, существует несколько подходов к определению необходимого объема памяти или к уменьшению объема используемой памяти. Одной из распространенных ошибок в языках с функцией сборки мусора, таких как Java или C#, является сохранение ссылок на объекты, которые вы больше не используете, или выделение большого количества объектов, когда их можно переиспользовать. Пока на объекты есть ссылка, они будут продолжать использовать пространство кучи, поскольку сборщик мусора не удалит их.

В этом случае можно воспользоваться профилировщиком памяти Java, чтобы определить, какие методы в вашей программе выделяют большое количество объектов, а затем определить, есть ли способ сделать так, чтобы на них больше не ссылались, или вообще не выделять их. Один из вариантов, который я использовал в прошлом, - это "JMP" .

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

В общем случае, если вы не можете гарантировать, что ваша программа будет выполняться в некотором ограниченном объеме памяти (возможно, зависящем от размера входных данных), вы всегда будете сталкиваться с этой проблемой. Только после того, как все это будет исчерпано, необходимо рассмотреть вопрос о кэшировании объектов на диск и т.д. На этом этапе у вас должна быть очень веская причина сказать "Мне нужно Xgb памяти" для чего-то, и вы не можете обойти эту проблему, улучшив свои алгоритмы или схемы выделения памяти. Как правило, это относится только к алгоритмам, работающим с большими массивами данных (например, базам данных или программам научного анализа), и тогда становятся полезными такие приемы, как кэширование и ввод-вывод с использованием памяти.

Комментарии (1)

Запустите Java с опцией командной строки -Xmx, которая устанавливает максимальный размер кучи.

Подробнее см. здесь.

Комментарии (3)

Вы могли определить за проект, сколько пространства кучи хочет Ваш проект

Следующее для Затмение Helios/Juno/Kepler :

Нажатие правой кнопки мышки на

 Run As - Run Configuration - Arguments - Vm Arguments, 

тогда добавьте это

-Xmx2048m
Комментарии (2)

Увеличение размера кучи не является " fix" это - " plaster" 100%-й временный служащий. Это потерпит крах снова в где-то в другом месте. Чтобы избежать этих проблем, напишите высокоэффективный кодекс.

  1. Используйте местные переменные по мере возможности.
  2. Удостоверьтесь, что Вы выбираете правильный объект (ИСКЛЮЧАЯ: Выбор между Последовательностью, StringBuffer и StringBuilder)
  3. Используйте хорошую кодовую систему для своей программы (ИСКЛЮЧАЯ: Используя статические переменные ПРОТИВ не статические переменные)
  4. Другой материал, который мог работать над Вашим кодексом.
  5. Попытайтесь двинуться со много ПРОНИЗЫВАНИЕМ
Комментарии (3)

Большой протест----в моем офисе, мы находили, что (на некоторых машинах окон) не могли ассигновать больше чем 512 м для Явской кучи. Это оказалось из-за антивирусного продукта Kaspersky, установленного на некоторых из тех машин. После деинсталлирования этого продукт AV, мы нашли, что могли ассигновать по крайней мере 1.6 ГБ, т.е., '-Xmx1600m' (m обязателен другое мудрое, которое это приведет к другой ошибке " Слишком маленькая начальная буква heap") работы.

Никакая идея, если это происходит с другими продуктами AV, но по-видимому это происходит, потому что программа AV резервирует маленький блок памяти в каждом адресном пространстве, таким образом, предотвращая единственное действительно большое распределение.

Комментарии (0)

Аргументы VM работали на меня в затмении. Если Вы используете версию 3.4 затмения, сделайте следующее

пойдите в 'Управляемый - > Конфигурации, которыми Управляют - &gt'; тогда выберите проект при знатоке, строят - > тогда выберите счет " JRE" - > тогда войдите в '-Xmx1024m'.

Кроме того, Вы могли сделать 'Пробег - > Конфигурации, которыми Управляют - > выберите " JRE" счет - &gt'; тогда войдите - 'Xmx1024m'

Это должно увеличить кучу памяти для всего строения/проектирования. Вышеупомянутый размер памяти составляет 1 ГБ. Вы можете оптимизировать способ, которым Вы хотите.

Комментарии (0)

Да, с помощью -Xmx можно сконфигурировать больше памяти для JVM. Чтобы убедиться в том, что память не утекает и не расходуется. Сделайте дамп кучи и используйте Eclipse Memory Analyzer для анализа потребляемой памяти.

Комментарии (1)

Я хотел бы добавить рекомендации от оракула стрельба проблемы статья.

Исключение в нити thread_name: java.lang. OutOfMemoryError: Явская куча делает интервалы

сообщение детали Явское пространство кучи указывает на объект, не могло быть ассигновано в Явской куче. Эта ошибка не обязательно подразумевает утечку памяти

Возможные причины:

  1. Простая проблема конфигурации, где указанный размер кучи недостаточен для применения.

  2. Применение неумышленно держит ссылки на объекты, и это препятствует объектам быть собранным мусором.

  3. Чрезмерное использование finalizers.

Еще один потенциальный источник этой ошибки возникает с заявлениями, которые делают чрезмерное использование finalizers. Если у класса есть завершить метод, то объектам того типа не исправили их пространство во время сборки мусора

После сборка мусора, объекты стоятся в очереди для завершение, который происходит в более позднее время. finalizers выполнены нитью демона, это обслуживает очередь завершения. Если finalizer нить не может не отставать от очереди завершения, то Явская куча могла заполниться и этот тип OutOfMemoryError , исключение будет брошено.

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

Комментарии (0)

Следуйте ниже шагов:

  1. Откройте 'catalina.sh' от кота/мусорного ведра.

  2. Измените JAVA_OPTS на

     JAVA_OPTS ="-Djava.awt.headless=true-Dfile.encoding=UTF-8 - сервер-Xms1536m 
     - Xmx1536m-XX:NewSize=256m-XX:MaxNewSize=256m-XX:PermSize=256m 
     - XX:MaxPermSize=256m-XX: + DisableExplicitGC"
  3. Перезапустите своего кота

Комментарии (0)

Я столкнулся с той же проблемой от явского размера кучи.

У меня есть два решения, если Вы используете Яву 5 (1.5).

  1. просто установите jdk1.6 и пойдите в предпочтения затмения и установите jre путь jav1 1.6, как Вы установили.

  2. Проверьте свой аргумент VM и позвольте ему быть независимо от того, что это. просто добавьте одну линию ниже всех аргументов, существующих в аргументах VM как

  • Xms512m-xmx512m-xx:maxpermsize =... m (192 м).

Я думаю, что это будет работать...

Комментарии (0)

Если Вы должны контролировать свое использование памяти во времени выполнения, 'java.lang.management' предложения 'MBeans', который может использоваться, чтобы контролировать фонды памяти в Вашем VM (например, пространство рая, штатное поколение и т.д.), и также поведение сборки мусора.

Свободное пространство кучи, о котором сообщают эти MBeans, изменится значительно в зависимости от поведения GC, особенно если Ваше заявление произведет много объектов, которые являются более поздним редактором GC. Один возможный подход должен контролировать свободное пространство кучи после каждого полного GC, который Вы можете быть в состоянии использовать, чтобы принять решение при освобождении памяти, упорствуя объекты.

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

Комментарии (0)

Я прочитал где-то в другом месте, что Вы можете попробовать - ловят java.lang. OutOfMemoryError и на блоке выгоды, Вы можете освободить все ресурсы, которые Вы знаете, мог бы использовать большую память, близкие связи и т.д, затем сделать 'System.gc ()' тогда повторяет то, что Вы собирались сделать.

Иначе это хотя, я don' t знают, работало ли это, но я в настоящее время проверяю, будет ли это работать над моим заявлением.

Идея состоит в том, чтобы сделать Сборку мусора, назвав System.gc (), который, как известно, увеличивает свободную память. Вы можете продолжать проверять это после того, как кодекс пожирающего памяти выполнит.


//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()
Комментарии (2)

Легкий способ решить 'OutOfMemoryError' на Яве состоит в том, чтобы увеличить максимальный размер кучи при помощи вариантов JVM '-Xmx512M', это немедленно решит Ваш OutOfMemoryError. Это - мое предпочтительное решение, когда я получаю OutOfMemoryError в Затмении, Знатоке или МУРАВЬЕ, в то время как строительный проект, потому что основанный на размере проекта Вы можете легко, исчерпал Память.

Вот пример увеличения максимального размера кучи JVM, Также лучше, чтобы держать-Xmx к-Xms нормируют или 1:1 или 1:1.5, если Вы устанавливаете размер кучи в своем JAVA-приложении.

'экспортируйте JVM_ARGS ="-Xms1024m-Xmx1024m&quot';

Справочная Связь

Комментарии (1)

По умолчанию для развития JVM использует небольшого размера и маленькую конфигурацию для других связанных с работой особенностей. Но для производства Вы можете настроиться, например, (Кроме того, это Сервер приложений, определенная конфигурация может существовать)-> (Если там все еще isn' t достаточно памяти, чтобы удовлетворить запрос и кучу уже достиг максимального размера, OutOfMemoryError произойдет),

-Xms        set initial Java heap size
-Xmx        set maximum Java heap size
-Xss        set java thread stack size

-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)

Например: На Платформе Linux для производственного способа предпочтительные параметры настройки.

После загрузки и формирования сервера с этим путем http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/

1.create setenv.sh файл на папке,/opt/tomcat/bin/

   touch /opt/tomcat/bin/setenv.sh
  1. Откройте и напишите этот params для урегулирования предпочтительного способа.
nano  /opt/tomcat/bin/setenv.sh 

export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"
  1. перезапуск кота 'service'

Обратите внимание, что JVM использует больше памяти, чем просто куча. Например, Явские методы, стопки нити и родные ручки ассигнованы в памяти отдельный от кучи, а также внутренних структур данных JVM.

Комментарии (0)

Обратите внимание, что, если Вам нужно это в ситуации с развертыванием, рассмотрите использование Явского WebStart (с " ondisk" версия, не сетевая - возможный на Яве 6u10 и позже), поскольку это позволяет Вам определять различные аргументы JVM кросс-платформенным способом.

Иначе Вам будет нужна операционная система определенная пусковая установка, которая устанавливает аргументы, в которых Вы нуждаетесь.

Комментарии (1)

Относительно к netbeans, Вы могли установить макс. размер кучи решать проблему.

Пойдите в ' Run' тогда - > ' Проект Набора Configuration' - > ' Customise' - > ' run' из его появившегося окна - > ' VM Option' - > заполните '-Xms2048m-Xmx2048m'.

Комментарии (0)

Если эта проблема происходит в Wildfly 8 и JDK1.8, то мы должны определить параметры настройки MaxMetaSpace вместо параметров настройки PermGen.

Например, мы должны добавить ниже конфигурации в setenv.sh файле wildfly. 'JAVA_OPTS =" $JAVA_OPTS-XX:MaxMetaspaceSize=256M&quot';

Для получения дополнительной информации, пожалуйста, проверьте Проблему Кучи Wildfly

Комментарии (0)

Если Вы продолжаете ассигновать & держа ссылки на объект, Вы заполните любой объем памяти, который Вы имеете.

Один выбор состоит в том, чтобы сделать прозрачный файл близко & откройтесь, когда они переключают счета (Вы только держите указатель на файл, и когда пользователь переключает счет, Вы закрываете & уберите все объекты... it' ll вносят изменение файла медленнее..., но...), и, возможно, держите только 3 или 4 файла на памяти.

Другая вещь, которую Вы должны сделать, когда пользователь открывает файл, загрузите ее и перехватите любой OutOfMemoryError, тогда (поскольку не возможно открыть файл), близко, что файл, уберите его объекты и предупредите пользователя, что он должен закрыть неиспользованные файлы.

Ваша идея динамичного распространения виртуальной памяти doesn' t решают проблему, поскольку машина ограничена на ресурсах, таким образом, Вы должны быть осторожным & проблемы памяти ручки (или по крайней мере, быть осторожным с ними).

Несколько намеков i' ve, замеченный с утечками памяти:

  • Сохраните ум, что, если Вы помещаете что-то в коллекцию и впоследствии забываете об этом, у Вас все еще есть сильная ссылка на него, поэтому аннулируйте коллекцию, уберите ее или сделайте что-то с нею..., если не Вы найдете, что память просачивается трудный найти.

  • Возможно, использование коллекций со слабыми ссылками (weakhashmap...) может помочь с проблемами памяти, но Вы должны быть осторожными с ним, поскольку Вы могли бы найти, что объект, который Вы ищете, был собран.

  • Другая идея i' найденный ve является к develope постоянной коллекцией, которая сохранила на наименее используемых объектах базы данных и прозрачно нагруженных. Это, вероятно, было бы лучшим подходом...

Комментарии (0)