- Насколько мне известно, пространство кучи занято только переменными экземпляра. Если это правильно, то почему эта ошибка возникла после того, как какое-то время нормально работала, поскольку пространство для переменных экземпляра выделяется во время создания объекта.
Это означает, что вы непрерывно создаете больше объектов в своем приложении в течение определенного периода времени. Новые объекты будут храниться в памяти кучи, и это причина увеличения объема памяти кучи.
Куча не только содержит переменные экземпляра. В нем будут храниться все непримитивные типы данных (объекты). Время жизни этих объектов может быть коротким (блок метода) или длинным (пока объект не будет указан в вашем приложении).
- Есть ли способ увеличить объем кучи?
Да. Взгляните на эту статью о Oracle для получения более подробной информации.
Есть два параметра для установки размера кучи:
-Xms:, который устанавливает начальный и минимальный размер кучи
-Xmx:, который устанавливает максимальный размер кучи
- Какие изменения я должен внести в свою программу, чтобы она занимала меньше места в куче?
Это зависит от вашего приложения.
Установите максимальную память кучи в соответствии с требованиями вашего приложения
Не вызывайте утечки памяти в вашем приложении
Если вы обнаружите утечки памяти в своем приложении, найдите основную причину с помощью инструментов профилирования, таких как MAT , Visual VM , jconsole и т. Д. Как только вы найдете основную причину, устраните утечки.
Важные примечания из статьи о Oracle
Причина: подробное сообщение «Пространство кучи Java» указывает на то, что объект не может быть размещен в куче Java. Эта ошибка не обязательно означает утечку памяти.
Возможные причины:
- Неправильная конфигурация (не выделяется достаточно памяти)
- Приложение непреднамеренно содержит ссылки на объекты, что предотвращает сборку мусора.
- Приложения, чрезмерно использующие финализаторы. Если у класса есть метод finalize, то пространство для объектов этого типа не освобождается во время сборки мусора. Если поток финализатора не может справиться с очередью финализации, то куча Java может заполниться, и возникнет исключение OutOfMemoryError этого типа .
С другой стороны, используйте лучшие алгоритмы сборки мусора ( CMS или G1GC ).
Взгляните на этот вопрос, чтобы понять G1GC