← Назад к вопросам

Что такое сборка мусора?

1.6 Junior🔥 171 комментариев
#JVM и управление памятью#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое сборка мусора?

Сборка мусора (Garbage Collection, GC) — это автоматический механизм управления памятью в Java, который освобождает память от объектов, на которые больше нет ссылок. Это одна из ключевых особенностей Java, которая избавляет разработчика от ручного управления памятью.

Как это работает

Основной принцип:

  1. JVM отслеживает все объекты в памяти
  2. Определяет, на какие объекты больше нет ссылок (недостижимы)
  3. Удаляет эти объекты, освобождая память
  4. Уплотняет кучу для эффективного использования пространства

Структура 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 кода и диагностики проблем с производительностью.

Что такое сборка мусора? | PrepBro