Java.lang.OutOfMemoryError: пространство кучи Java

Я получаю следующую ошибку при выполнении многопоточной программы

java.lang.OutOfMemoryError: Java heap space

Вышеприведенная ошибка произошла в одном из потоков.

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

  • Есть ли способ увеличить кучу пространства?

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

Ответ 1

Если вы хотите увеличить пространство кучи, вы можете использовать java -Xms<initial heap size> -Xmx<maximum heap size> в командной строке. По умолчанию значения основаны на версии JRE и конфигурации системы. Вы можете узнать больше о параметрах виртуальной машины на веб-сайте Java.

Тем не менее, я бы рекомендовал профилировать ваше приложение, чтобы узнать, почему ваш размер кучи съедается. NetBeans имеет очень хороший профилировщик, включенный в него. Я считаю, что он использует jvisualvm под капотом. С профилировщиком вы можете попытаться найти, где создаются многие объекты, когда объекты собирают мусор и т.д.

Ответ 2

1.- Да, но это в значительной степени относится ко всей памяти, используемой вашей программой.

2.- Да, см. параметры Java VM

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

Ie

java -Xmx2g назначьте 2 гигабайта бара как максимум вашему приложению

Но вы должны убедиться, что у вас нет утечки памяти.

3.- Это зависит от программы. Попробуйте устранить утечки памяти. На этот вопрос было бы трудно ответить. В последнее время вы можете профилировать с помощью JConsole, чтобы узнать, где находится ваша память.

Ответ 3

Вы можете посмотреть этот сайт, чтобы узнать больше о памяти в JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage

Я нашел полезным использовать visualgc, чтобы посмотреть, как заполняются разные части модели памяти, чтобы определить, что изменение.

Трудно определить, какая часть памяти была заполнена, следовательно, visualgc, поскольку вы можете просто изменить часть, которая имеет проблему, а не просто сказать,

Отлично! Я дам 1G ОЗУ для JVM.

Попытайтесь уточнить, что вы делаете, в конечном итоге вы, вероятно, найдете программу лучше для нее.

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

Ответ 4

Чтобы увеличить размер кучи, вы можете использовать аргумент -Xmx при запуске Java; например.

-Xmx256M

Ответ 5

Вы можете получить размер памяти кучи с помощью ниже программы.

public class GetHeapSize {
    public static void main(String[] args) {
        long heapsize = Runtime.getRuntime().totalMemory();
        System.out.println("heapsize is :: " + heapsize);
    }
} 

то соответственно вы можете увеличить размер кучи и используя: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Ответ 6

  1. В большинстве случаев код не оптимизирован. Отпустите те объекты, которые, по вашему мнению, больше не понадобятся. Избегайте создания объектов в вашем цикле каждый раз. Попробуйте использовать кеши. Я не знаю, как работает ваше приложение. Но в программировании также применяется одно правило нормальной жизни

    Профилактика лучше, чем лечение. "Не создавать ненужные объекты"

Ответ 7

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

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

Куча не только содержит переменные экземпляра. Он будет хранить все непримитивные типы данных (объекты). Время жизни этих объектов может быть коротким (блок метода) или длинным (пока объект не будет указан в вашем приложении)

  1. Есть ли способ увеличить пространство кучи?

Да. Взгляните на этот оракул статью для более подробной информации.

Существует два параметра для установки размера кучи:

-Xms:, который устанавливает начальный и минимальный размер кучи

-Xmx:, который устанавливает максимальный размер кучи

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

Это зависит от вашего приложения.

  • Установите максимальную кучную память в соответствии с требованиями вашего приложения

  • Не вызывайте утечки памяти в приложении

  • Если вы обнаружили утечки памяти в своем приложении, найдите основную причину с помощью инструментов профилирования, таких как MAT, Visual VM, jconsole и т.д. Как только вы найдете основная причина, исправить утечки.

Важные примечания от oracle статья

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

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

  • Неправильная настройка (не выделение достаточной памяти)
  • Приложение непреднамеренно содержит ссылки на объекты, и это предотвращает сбор мусора.
  • Приложения, которые чрезмерно используют финализаторы. Если класс имеет метод finalize, то объекты этого типа не имеют своего пространства, исправленного во время сбора мусора. Если поток финализатора не может идти в ногу, с завершающей очередью, тогда куча Java может заполнить и исключить этот тип исключения OutOfMemoryError.

В другой заметке используйте лучшие алгоритмы сбора мусора (CMS или G1GC)

Посмотрите на question для понимания G1GC

Ответ 8

  • Локальные переменные расположены в стеке. Пустое пространство занято объектами.

  • Вы можете использовать опцию -Xmx.

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

Ответ 9

Нет, я думаю, вы думаете о стеке. Пустое пространство занято объектами. Способ увеличить его -Xmx256m, заменив 256 на сумму, которая вам нужна в командной строке.

Ответ 10

В netbeans перейдите на панель инструментов "Запустить", → "Настроить конфигурацию проекта" → "Настроить" → "Запустить" его всплывшего windo → "VM Option" → заполнить '-Xms2048m -Xmx2048m'. Это может решить проблему размера кучи.