← Назад к вопросам
Что такое сборка мусора?
1.6 Junior🔥 171 комментариев
#JVM и управление памятью#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое сборка мусора?
Сборка мусора (Garbage Collection, GC) — это автоматический механизм управления памятью в Java, который освобождает память от объектов, на которые больше нет ссылок. Это одна из ключевых особенностей Java, которая избавляет разработчика от ручного управления памятью.
Как это работает
Основной принцип:
- JVM отслеживает все объекты в памяти
- Определяет, на какие объекты больше нет ссылок (недостижимы)
- Удаляет эти объекты, освобождая память
- Уплотняет кучу для эффективного использования пространства
Структура heap (куча)
┌─────────────────────────────────────┐
│ Young Generation │
│ ┌─────────┬─────────┬─────────┐ │
│ │ Eden │ Survivor│ Survivor│ │
│ │ Space │ S0 │ S1 │ │
│ └─────────┴─────────┴─────────┘ │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Old Generation (Tenured) │
└─────────────────────────────────────┘
Процесс сборки мусора
1. Minor GC (молодое поколение)
// При переполнении Eden Space запускается Minor GC
Object obj1 = new Object(); // выделяется в Eden
Object obj2 = new Object(); // выделяется в Eden
obj1 = null; // obj1 становится мусором
// Minor GC: проверяет Eden, перемещает живые объекты в Survivor
2. Major GC (старое поколение)
- Происходит реже, но дороже по времени
- Объекты из Survivor переходят в Old Generation если пережили несколько Minor GC
3. Full GC (полная сборка)
- Сборка всех поколений
- Самая затратная операция
- Может вызвать "стоп мира" (stop-the-world pause)
Алгоритмы сборки мусора
// G1GC (Garbage First) - по умолчанию в Java 9+
// -XX:+UseG1GC
// Делит heap на регионы, собирает мусор с наибольшим количеством мусора
// Serial GC - однопоточный, для небольших приложений
// -XX:+UseSerialGC
// Parallel GC - многопоточный, для пакетной обработки
// -XX:+UseParallelGC
// CMS (Concurrent Mark Sweep) - параллельный сборщик
// -XX:+UseConcMarkSweepGC (deprecated в Java 14)
// ZGC - низкоLatency сборщик, паузы < 10ms
// -XX:+UseZGC
Поколенческая гипотеза
Сборщики мусора основаны на наблюдении: "большинство объектов живут недолго"
for (int i = 0; i < 1000000; i++) {
Object temp = new Object(); // временный объект
// используем temp
} // temp удаляется тут, никогда не попадет в Old
List<Object> longLived = new ArrayList<>();
// объекты в longLived переживают несколько Minor GC и переходят в Old
Когда происходит GC
// 1. Когда heap переполняется
// 2. Явный вызов (не гарантирует выполнение!)
System.gc(); // Request, не команда
Runtime.getRuntime().gc();
// 3. Автоматически по расписанию (зависит от алгоритма)
Влияние на performance
- Паузы GC — время когда приложение стоит (stop-the-world)
- Фрагментация кучи — неэффективное использование памяти
- Давление на CPU — потоки GC конкурируют за ресурсы
Оптимизация
// Правильно: переиспользовать объекты
List<Object> list = new ArrayList<>(10000);
for (int i = 0; i < 1000000; i++) {
Object obj = new Object();
list.add(obj);
// obj не станет мусором, будет переиспользован в循环
}
// Неправильно: создание лишних объектов
String result = "";
for (int i = 0; i < 1000; i++) {
result = result + i; // создает новый String каждый раз!
}
// Правильно:
StringBuilder result = new StringBuilder();
for (int i = 0; i < 1000; i++) {
result.append(i); // переиспользует буфер
}
Понимание сборки мусора критично для написания эффективного Java кода и диагностики проблем с производительностью.