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

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

вы можете указать начальный и максимальный размер кучи для своего приложения, установив параметры:
-Xms ‹size›
-Xmx ‹size›
Xms64m -Xmx512m

JVM начинается с 64M, увеличивается (до максимального потолка 512), если mem. требования превышают 64.

  1. Проверка утечек памяти с помощью Eclipse:
    Все, что реализует closable (начиная с версии 1.5) (например, outputstream с версии 1.5), выдает предупреждение, если ссылка на него уничтожена, но объект не закрыт.
    В проекте Eclipse ›Настройки проекта› Компилятор JAVA ›Ошибки / Предупреждение› выберите утечку из опций
  2. Проверьте свой код:
    Статические поля: статическая ссылка сохраняется, поэтому объект не может быть удален из памяти.
    Демонические потоки, запущенные вне жизненного цикла цикл веб-приложения подвержен утечке памяти.
    Закрытие соединения: закрытие всех файловых соединений и соединений с БД может предотвратить утечку памяти. Всегда закрывайте соединение в блоке finally.
    Назначение нуля: присвоение значения null списку, картам и т. Д. После их использования также может предотвратить утечку памяти.
    AutoBoxing каждый раз создает новый объект, избегайте смешивания примитивов с классами-оболочками при переходе к функциям.
  3. Анализ использования памяти:

Такие инструменты, как JProfiler, GC Viewer, VisualVM, JConsole помогают анализировать производительность вашего приложения.
вы можете проанализировать свой код, запустив приложение с прикрепленным к нему VisualVM. Затем выполните задачу, которая замедляет работу вашего приложения, и проанализируйте вкладки монитор и пулы памяти.
просмотрите всплески использования памяти и нажмите кнопку Perform GC, которая освободит память .

Вывоз мусора

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

Метод java.lang.System.gc () запускает сборщик мусора.
Согласно Oracle:
Вызов метода gc предполагает, что виртуальная машина Java затрачивает усилия на переработку неиспользуемых объектов, чтобы сделать память, которую они в настоящее время занимают, доступной для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java сделала все возможное, чтобы освободить пространство для всех отброшенных объектов.
Вызов System.gc () фактически эквивалентен вызову:
Runtime.getRuntime (). gc ()

Если объект подходит для сборки мусора, он не может быть уничтожен немедленно сборщиком мусора. Всякий раз, когда JVM запускает программу сборщика мусора, будет уничтожен только объект. Но мы не можем ожидать, когда JVM запустит сборщик мусора.

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

Некоторые люди устанавливают для ссылки на объект значение null, чтобы сделать его подходящим для gc, и используют метод System.gc () для явного удаления памяти. Установка для него значения null не имеет большого значения, но вызов метода System.gc () сильно повлияет на производительность системы и не должен выполняться.



Поколения JVM:

Куча разбита на более мелкие части или поколения. Части кучи: молодое поколение, старое или постоянное поколение и постоянное поколение.

  1. Молодое поколение - это то место, где размещаются и выдерживаются все новые объекты. Когда молодое поколение заполняется, это вызывает незначительную сборку мусора.
  2. Старое поколение используется для хранения давно уцелевших объектов. Обычно порог устанавливается для объекта молодого поколения, и когда этот возраст достигается, объект перемещается в старое поколение. В конце концов нужно собрать старое поколение. Это событие называется основной сборкой мусора.
  3. Постоянная генерация содержит метаданные, необходимые JVM для описания классов и методов, используемых в приложении.

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

Это было простое и небольшое объяснение утечек памяти и работы сборщика мусора.
Полная работа генерации сборщика мусора и JVM, то, как объекты перемещаются из одного поколения в другое, можно изучить в документации Oracle здесь