Я получаю следующую ошибку при выполнении многопоточной программы
java.lang.OutOfMemoryError: Java heap space
Вышеупомянутая ошибка произошла в одном из потоков.
Насколько мне известно, пространство кучи занято только переменными экземпляра. Если это правильно, то почему эта ошибка возникла после того, как какое-то время нормально работала, поскольку пространство для переменных экземпляра выделяется во время создания объекта.
Есть ли способ увеличить объем кучи?
Какие изменения я должен внести в свою программу, чтобы она занимала меньше места в куче?
java
multithreading
out-of-memory
heap-memory
Ятендра Гоэль
источник
источник
Ответы:
Если вы хотите увеличить пространство кучи, вы можете использовать его
java -Xms<initial heap size> -Xmx<maximum heap size>
в командной строке. По умолчанию значения основаны на версии JRE и конфигурации системы. Вы можете узнать больше о параметрах виртуальной машины на веб-сайте Java .Однако я бы рекомендовал профилировать ваше приложение, чтобы узнать, почему ваш размер кучи съедается. NetBeans имеет очень хороший профилировщик . Я считаю, что он использует
jvisualvm
под капотом. С помощью профилировщика вы можете попытаться найти, где создается много объектов, когда объекты собираются сборщиком мусора и т. Д.источник
1.- Да, но это в значительной степени относится ко всей памяти, используемой вашей программой.
2.- Да, см. Параметры Java VM
Т.е.
java -Xmx2g
назначьте вашему приложению максимум 2 гигабайта оперативной памятиНо сначала вы должны проверить, нет ли у вас утечки памяти.
3.- Это зависит от программы. Попробуйте определить утечки памяти. На этот вопрос было бы сложно ответить. В последнее время вы можете профилировать с помощью JConsole, чтобы попытаться выяснить, куда собирается ваша память.
источник
Вы можете посетить этот сайт, чтобы узнать больше о памяти в JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
Я счел полезным использовать visualgc, чтобы посмотреть, как заполняются различные части модели памяти, чтобы определить, что нужно изменить.
Трудно определить, какая часть памяти была заполнена, следовательно, visualgc, так как вы можете просто изменить часть, в которой возникла проблема, а не просто сказать:
Постарайтесь быть более точными в том, что вы делаете, в конечном итоге вы, вероятно, найдете программу лучше для этого.
Чтобы определить, где может быть утечка памяти, вы можете использовать для этого модульные тесты, проверяя, какой была память до теста и после, и если есть слишком большое изменение, вы можете проверить его, но вам необходимо сделайте проверку, пока ваш тест еще запущен.
источник
Чтобы увеличить размер кучи, вы можете использовать аргумент -Xmx при запуске Java; например
источник
Вы можете получить размер кучи с помощью приведенной ниже программы.
соответственно, вы можете увеличить размер кучи, используя: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
источник
Это означает, что вы непрерывно создаете больше объектов в своем приложении в течение определенного периода времени. Новые объекты будут храниться в памяти кучи, и это причина увеличения объема памяти кучи.
Куча не только содержит переменные экземпляра. В нем будут храниться все непримитивные типы данных (объекты). Время жизни этих объектов может быть коротким (блок метода) или длинным (пока объект не будет указан в вашем приложении).
Да. Взгляните на эту статью о Oracle для получения более подробной информации.
Есть два параметра для установки размера кучи:
-Xms:, который устанавливает начальный и минимальный размер кучи
-Xmx:, который устанавливает максимальный размер кучи
Это зависит от вашего приложения.
Установите максимальную память кучи в соответствии с требованиями вашего приложения
Не вызывайте утечки памяти в вашем приложении
Если вы обнаружите утечки памяти в своем приложении, найдите основную причину с помощью инструментов профилирования, таких как MAT , Visual VM , jconsole и т. Д. Как только вы найдете основную причину, устраните утечки.
Важные примечания из статьи о Oracle
Возможные причины:
С другой стороны, используйте лучшие алгоритмы сборки мусора ( CMS или G1GC ).
Взгляните на этот вопрос, чтобы понять G1GC
источник
В большинстве случаев код не оптимизирован. Освободите те предметы, которые, по вашему мнению, в дальнейшем не понадобятся. Избегайте создания объектов в вашем цикле каждый раз. Попробуйте использовать кеши. Я не знаю, как дела у вашего приложения. Но в программировании действует и одно правило нормальной жизни.
Профилактика лучше, чем лечение. «Не создавайте лишних предметов»
источник
Локальные переменные находятся в стеке. Пространство кучи занято объектами.
Вы можете использовать
-Xmx
опцию.В основном пространство кучи используется каждый раз, когда вы выделяете новый объект,
new
и освобождается через некоторое время после того, как на объект больше не ссылаются. Поэтому убедитесь, что вы не храните ссылки на объекты, которые вам больше не нужны.источник
Нет, я думаю, вы думаете о пространстве стека. Пространство кучи занято объектами. Способ увеличения - -Xmx256m, заменив 256 на нужную вам сумму в командной строке.
источник
Чтобы избежать этого исключения, если вы используете JUnit и Spring, попробуйте добавить это в каждый тестовый класс:
источник
В netbeans перейдите на панель инструментов «Выполнить», -> «Установить конфигурацию проекта» -> «Настроить» -> «запустить» его всплывающего окна windo -> «Вариант виртуальной машины» -> заполните «-Xms2048m» -Xmx2048m '. Это может решить проблему размера кучи.
источник