Руководство по управлению памятью Java (и спасению вашего кода)

Примечание переводчика: желание перевести заметку появилось ранним июньским утром после прочтения ее в полусонном состоянии в вагоне метро. Целевая аудитория: люди, делающие первые шаги в мире Java и по роду своего основного технического бэкграунда или желания сильно жаждут забраться под капот Java и изучить все «электродинамические» процессы. Уверен, что для прочитавших это будет отправной точкой путешествия в мир настройки JVM и GC. Попутного ветра!
Оригинал статьи лежит здесь


Будучи разработчиком, вы проводите бесчисленные часы за вычищением багов из Java-приложения и достижением производительности в тех местах где нужно. Во время тестирования замечаете, что приложение постепенно работает медленней, и в конце полностью заваливается или просто демонстрирует плохую производительность. В конечном счете признаете, что происходят утечки памяти. Garbage collector Java делает всё что может, чтобы справиться с этими утечками. Но есть только много вещей, которые можно выполнить, когда сталкиваетесь с ситуациями подобными этим. Вам нужны способы идентификации вызовов утечек памяти, выявления причин и понимания роли Java garbage collector'а влияющего на общую производительность приложения.
  • ,

Сборка мусора

Сборка мусора


Линия поведения сборщика мусора (утилизатора памяти)

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

Разные JVM имеют отличные друг от друга алгоритмы сбора мусора. Существует несколько используемых алгоритмов, например: алгоритм подсчёта ссылок или алгоритмы разметки и очистки. Подробнее о сборщике мусора см. Ресурсы.

Запуск сборщика мусора

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

Если памяти недостаточно даже после восстановления, JVM генерирует исключение OutOfMemoryError. Обратите внимание, что перед генерированием исключения JVM обязательно запускает сборщик мусора как минимум 1 раз.

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