Вопрос

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

java.lang.OutOfMemoryError: Java heap space

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Т.е.

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

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

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

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

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

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

Отлично!Я выделю 1 ГБ оперативной памяти для JVM.

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

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

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

-Xmx256M

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

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

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

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

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

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

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

Да.Взгляните на этого оракула статья Больше подробностей.

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

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

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

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

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

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

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

  3. Если вы обнаружите утечки памяти в своем приложении, найдите основную причину с помощью таких инструментов профилирования, как МАТ, Визуальная виртуальная машина , jконсоль и т. д.Как только вы найдете основную причину, устраните утечки.

Важные замечания от Oracle статья

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

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

  1. Неправильная конфигурация (не выделяется достаточно памяти)
  2. Приложение непреднамеренно хранит ссылки на объекты, и это предотвращает сбор мусора для объектов.
  3. Приложения, которые чрезмерно используют финализаторы.Если у класса есть метод Finalize, то пространство объектов этого типа не освобождается во время сборки мусора. Если поток финализатора не может справиться с очередью финализации, куча Java может заполниться, и будет выдано исключение OutOfMemoryError этого типа..

С другой стороны, используйте лучшие алгоритмы сборки мусора ( система управления контентом или G1GC)

Посмотри на это вопрос для понимания G1GC

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

    Профилактика лучше лечения.«Не создавайте ненужных объектов»

  1. Локальные переменные располагаются в стеке.Пространство кучи занято объектами.

  2. Вы можете использовать -Xmx вариант.

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

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

В netbeans перейдите на панель инструментов «Выполнить» -> «Задать конфигурацию проекта» -> «Настроить» -> «Запустить» всплывающее окно -> «Параметры VM» -> заполнить «-Xms2048m». -Xmx2048m'.Это может решить проблему размера кучи.

Чтобы избежать этого исключения, если вы используете JUnit и Spring, попробуйте добавить это в каждый тестовый класс:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top