Учебники

Виртуальная машина Java — Сборка мусора

Жизненный цикл объекта Java управляется JVM. Как только объект создан программистом, нам не нужно беспокоиться об оставшейся части его жизненного цикла. JVM автоматически найдет те объекты, которые больше не используются, и освободит их память из кучи.

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

Вы не можете освобождать объект программно в Java, как вы можете делать в не-GC языках, таких как C и C ++. Таким образом, вы не можете иметь висячие ссылки в Java. Однако у вас могут быть нулевые ссылки (ссылки, которые относятся к области памяти, где JVM никогда не будет хранить объекты). Всякий раз, когда используется нулевая ссылка, JVM генерирует исключение NullPointerException.

Обратите внимание, что, хотя GC редко обнаруживает утечки памяти в программах Java, они случаются. Мы создадим утечку памяти в конце этой главы.

Следующие GC используются в современных JVM

  • Серийный коллектор
  • Пропускной коллектор
  • CMS коллектор
  • Коллектор G1

Каждый из вышеперечисленных алгоритмов выполняет одну и ту же задачу — находит объекты, которые больше не используются, и освобождает память, которую они занимают в куче. Один из наивных подходов к этому — подсчитать количество ссылок, которые есть у каждого объекта, и освободить его, как только число ссылок станет равным 0 (это также называется подсчетом ссылок). Почему это наивно? Рассмотрим круговой связанный список. Каждый из его узлов будет иметь ссылку на него, но на весь объект нигде нет ссылок, и в идеале его следует освободить.

JVM не только освобождает память, но и объединяет небольшие блоки памяти в большие. Это сделано для предотвращения фрагментации памяти.

Проще говоря, типичный алгоритм GC выполняет следующие действия:

  • Нахождение неиспользованных предметов
  • Освобождая память, которую они занимают в куче
  • Объединение фрагментов

GC должен остановить потоки приложения во время его работы. Это потому, что он перемещает объекты во время работы, и, следовательно, эти объекты не могут быть использованы. Такие остановки называются «паузами остановки мира», а минимизация частоты и продолжительности этих пауз — это то, к чему мы стремимся при настройке нашего GC.

Объединение памяти

Простая демонстрация объединения памяти показана ниже

Объединение памяти

Затененная часть — это объекты, которые необходимо освободить. Даже после того, как все пространство будет освобождено, мы можем выделить только объект с максимальным размером = 75 КБ. Это даже после того, как у нас есть 200 КБ свободного места, как показано ниже