Виртуальная машина Java - сборка мусора
Жизненным циклом объекта Java управляет JVM. После того, как объект создан программистом, нам не нужно беспокоиться об остальной части его жизненного цикла. JVM автоматически найдет те объекты, которые больше не используются, и освободит их память из кучи.
Сборка мусора - это важная операция, которую выполняет JVM, и ее настройка для наших нужд может значительно повысить производительность нашего приложения. Современные JVM предоставляют множество алгоритмов сборки мусора. Нам нужно знать, что нашему приложению необходимо решить, какой алгоритм использовать.
Вы не можете программно освободить объект в Java, как это можно сделать в языках, отличных от GC, таких как C и C ++. Следовательно, в Java не может быть висячих ссылок. Однако у вас могут быть пустые ссылки (ссылки, которые относятся к области памяти, где JVM никогда не будет хранить объекты). Всякий раз, когда используется пустая ссылка, JVM выдает исключение NullPointerException.
Обратите внимание, что, хотя утечки памяти в программах Java встречаются редко, благодаря GC, они все же случаются. Мы создадим утечку памяти в конце этой главы.
Следующие GC используются в современных JVM
- Серийный коллектор
- Коллектор пропускной способности
- Сборщик CMS
- Коллектор G1
Каждый из вышеперечисленных алгоритмов выполняет одну и ту же задачу - находит объекты, которые больше не используются, и освобождает память, занимаемую ими в куче. Один из наивных подходов к этому - подсчитать количество ссылок, которые имеет каждый объект, и освободить его, как только количество ссылок станет равным 0 (это также известно как подсчет ссылок). Почему это наивно? Рассмотрим круговой связанный список. Каждый из его узлов будет иметь ссылку на него, но на весь объект нет ссылок из любого места, и в идеале он должен быть освобожден.
JVM не только освобождает память, но и объединяет небольшие блоки памяти в более крупные. Это сделано для предотвращения фрагментации памяти.
Проще говоря, типичный алгоритм GC выполняет следующие действия:
- Поиск неиспользуемых предметов
- Освобождение памяти, которую они занимают в куче
- Объединение фрагментов
GC должен останавливать потоки приложений во время его работы. Это потому, что он перемещает объекты во время работы, и, следовательно, эти объекты нельзя использовать. Такие остановки называются паузами «остановки мира», и мы стремимся к минимизации частоты и продолжительности этих пауз при настройке нашего GC.
Объединение памяти
Простая демонстрация объединения памяти показана ниже.
Заштрихованная часть - это объекты, которые нужно освободить. Даже после того, как все пространство будет освобождено, мы можем выделить только объект максимального размера = 75 КБ. Это даже после того, как у нас будет 200 КБ свободного места, как показано ниже.