Раздел 3 · 28 вопросов

Память и Garbage Collection

28 вопросов и ответов в разделе Память и Garbage Collection.

Russian Память и Garbage Collection Исходный Markdown
Версии по языкам: English Russian Ukrainian

Вопросы этого раздела

  1. В чём разница между Heap и Stack?
  2. Что хранится в Heap?
  3. Что хранится в Stack?
  4. Что такое Garbage Collection?
  5. Когда объект становится кандидатом на удаление GC?
  6. Что такое утечка памяти в Java?
  7. Как может возникнуть утечка памяти в Java?
  8. Что такое поколения в GC (young, old, metaspace)?
  9. Что такое Young Generation?
  10. Что такое Old Generation (Tenured)?
  11. Что такое Metaspace (или PermGen)?
  12. Какие алгоритмы GC существуют?
  13. Что такое G1 GC?
  14. Что такое ZGC?
  15. Что такое Shenandoah GC?
  16. Что такое stop-the-world?
  17. Какие GC минимизируют stop-the-world паузы?
  18. Что такое параметры -Xms и -Xmx?
  19. Что произойдёт при OutOfMemoryError?
  20. Какие типы OutOfMemoryError существуют?
  21. Что такое memory leak и как его обнаружить?
  22. Какие инструменты помогают анализировать память?
  23. Что такое heap dump?
  24. Как получить heap dump?
  25. Что такое GC roots?
  26. Что такое reachability в контексте GC?
  27. Можно ли вручную вызвать GC?
  28. Почему не стоит вызывать System.gc()?

Навигатор по разделу

28 вопросов для подготовки к собеседованию на Middle/Senior Java Developer.


📋 Все вопросы

# Вопрос Уровень сложности
1 В чём разница между Heap и Stack
2 Что хранится в Heap
3 Что хранится в Stack
4 Что такое Garbage Collection ⭐⭐
5 Когда объект становится кандидатом на удаление GC ⭐⭐
6 Что такое утечка памяти в Java ⭐⭐
7 Как может возникнуть утечка памяти в Java ⭐⭐
8 Что такое поколения в GC ⭐⭐
9 Что такое Young Generation ⭐⭐
10 Что такое Old Generation (Tenured) ⭐⭐
11 Что такое Metaspace (или PermGen) ⭐⭐
12 Какие алгоритмы GC существуют ⭐⭐⭐
13 Что такое G1 GC ⭐⭐⭐
14 Что такое ZGC ⭐⭐⭐
15 Что такое Shenandoah GC ⭐⭐⭐
16 Что такое stop-the-world ⭐⭐
17 Какие GC минимизируют stop-the-world паузы ⭐⭐⭐
18 Что такое параметры -Xms и -Xmx
19 Что произойдёт при OutOfMemoryError ⭐⭐
20 Какие типы OutOfMemoryError существуют ⭐⭐
21 Что такое memory leak и как его обнаружить ⭐⭐⭐
22 Какие инструменты помогают анализировать память ⭐⭐
23 Что такое heap dump ⭐⭐
24 Как получить heap dump ⭐⭐
25 Что такое GC roots ⭐⭐
26 Что такое reachability в контексте GC ⭐⭐⭐
27 Можно ли вручную вызвать GC
28 Почему не стоит вызывать System.gc() ⭐⭐

🗺️ Карта зависимостей тем

                    ┌──────────────────────────────────────────┐
                    │   ПАМЯТЬ JVM (1-3)                       │
                    │   1. Heap vs Stack                       │
                    │   2. Что в Heap                          │
                    │   3. Что в Stack                         │
                    └──────────────────┬───────────────────────┘
                                       │
            ┌──────────────────────────┼──────────────────────────┐
            ▼                          ▼                          ▼
    ┌───────────────┐        ┌───────────────┐        ┌────────────────────┐
    │ GC ОСНОВЫ      │        │ ПОКОЛЕНИЯ      │        │ УТЕЧКИ             │
    │ (4-5)          │        │ (8-11)         │        │ (6-7)              │
    │ 4. GC обзор    │        │ 8. Поколения   │        │ 6. Memory Leak     │
    │ 5. Кандидаты   │        │ 9. Young Gen   │        │ 7. Как возникает   │
    │    на удаление │        │ 10. Old Gen    │        │                    │
    │                │        │ 11. Metaspace  │        │                    │
    └───────┬───────┘        └───────┬───────┘        └────────┬───────────┘
            │                        │                        │
            └────────────────────────┼────────────────────────┘
                                     ▼
                    ┌──────────────────────────────────────────┐
                    │   GC АЛГОРИТМЫ (12-17)                   │
                    │   12. Алгоритмы обзор                    │
                    │   13. G1 GC                              │
                    │   14. ZGC                                │
                    │   15. Shenandoah GC                      │
                    │   16. Stop-the-World                     │
                    │   17. Low-latency GC                     │
                    └──────────────────────────────────────────┘
                                     │
            ┌────────────────────────┼────────────────────────┐
            ▼                        ▼                        ▼
    ┌───────────────┐        ┌───────────────┐        ┌────────────────────┐
    │ TUNING & OOM   │        │ DIAGNOSTICS    │        │ REACHABILITY       │
    │ (18-20)        │        │ (21-24)        │        │ (25-28)            │
    │ 18. -Xms/-Xmx  │        │ 21. Leak detect│        │ 25. GC Roots       │
    │ 19. OOM что    │        │ 22. Инструменты│        │ 26. Reachability   │
    │ 20. OOM типы   │        │ 23. Heap dump  │        │ 27. Вызвать GC     │
    │                │        │ 24. Получить   │        │ 28. System.gc()    │
    └───────────────┘        └───────────────┘        └────────────────────┘

🎯 Рекомендуемый порядок изучения

🟢 Уровень Junior (недели 1-2)

Шаг Тема Файлы Цель
1 Heap vs Stack Q1, Q2, Q3 Где хранятся объекты, примитивы, ссылки
2 GC базовый Q4, Q5 Что такое GC, когда объект кандидат на удаление
3 Поколения Q8, Q9, Q10, Q11 Young, Old, Metaspace — зачем и что там
4 -Xms/-Xmx Q18 Настройка Heap
5 System.gc() Q27, Q28 Почему не вызывать вручную

🟡 Уровень Middle (недели 3-4)

Шаг Тема Файлы Цель
1 Алгоритмы GC Q12 Mark-Sweep, Mark-Compact, Copying — чем отличаются
2 G1 GC Q13 Regions, RSet, CSet, Mixed GC, String Deduplication
3 Утечки памяти Q6, Q7 ThreadLocal, static коллекции, inner classes
4 OOM Q19, Q20 Что происходит, типы OOME
5 STW Q16, Q17 Зачем, какие GC минимизируют, Allocation Stall
6 Инструменты Q22, Q23, Q24 jmap, jstat, MAT, heap dump

🔴 Уровень Senior (недели 5-6)

Шаг Тема Файлы Цель
1 ZGC Q14 Colored Pointers, Load Barriers, Multi-mapping, Generational
2 Shenandoah Q15 Load Reference Barriers, Brooks Pointers, vs ZGC
3 Reachability Q25, Q26 GC Roots, Strong/Soft/Weak/Phantom, Cleaner, OopMaps
4 Leak detection Q21 Delta analysis, sawtooth pattern, dominator tree
5 GC tuning Q18 -Xms=-Xmx, Compressed OOPs, NUMA, G1 tuning
6 Escape Analysis Q1 (Senior) Scalar Replacement, Lock Elision, TLAB

🔗 Ключевые связи между темами

Тема: Память JVM

Q1 (Heap vs Stack) → Q2 (Что в Heap) → Q3 (Что в Stack)
     ↓
Q4 (GC обзор) → Q5 (Кандидаты на удаление)

Ключевые связи:

  • Q1 ↔ Q5: Reachability из GC Roots определяет кандидат на удаление
  • Q2 ↔ Q11: Metaspace — часть памяти вне Heap
  • Q3 ↔ Q25: Stack содержит GC Roots (локальные переменные)

Тема: Поколения GC

Q8 (Поколения) → Q9 (Young Gen) → Q10 (Old Gen) → Q11 (Metaspace)

Ключевые связи:

  • Q9 ↔ Q10: Объекты promuте из Young в Old после выживания нескольких Minor GC
  • Q8 ↔ Q12: Поколенческая гипотеза → разные алгоритмы для Young и Old
  • Q11 ↔ Q2: Metaspace не в Heap, но OOME всё равно возможен

Тема: GC Алгоритмы

Q12 (Алгоритмы) → Q13 (G1) → Q14 (ZGC) → Q15 (Shenandoah)
     ↓                    ↓
Q16 (STW) ←──── Q17 (Low-latency GC)

Ключевые связи:

  • Q13 ↔ Q14: G1 → предсказуемые паузы, ZGC → < 1 мс паузы
  • Q14 ↔ Q15: ZGC (Colored Pointers) vs Shenandoah (Brooks Pointers) — разные подходы
  • Q16 ↔ Q17: STW — что замирает, какие GC минимизируют

Тема: Диагностика и Reachability

Q25 (GC Roots) → Q26 (Reachability) → Q27 (Вызвать GC) → Q28 (System.gc())
     ↓
Q21 (Leak detect) → Q22 (Инструменты) → Q23 (Heap dump) → Q24 (Получить dump)

Ключевые связи:

  • Q25 ↔ Q26: GC Roots —起点 reachability analysis
  • Q21 ↔ Q23: Heap dump — главный инструмент диагностики утечек
  • Q27 ↔ Q28: Можно вызвать, но НЕ стоит — почему

🎓 Шпаргалка: что знать для каждого уровня

🟢 Junior

  • Heap = объекты, Stack = локальные переменные + вызовы методов
  • GC автоматически освобождает память недостижимых объектов
  • Поколения: Young (новые), Old (долгоживущие), Metaspace (метаданные классов)
  • -Xms = начальный Heap, -Xmx = максимальный
  • System.gc() — рекомендация, JVM может проигнорировать

🟡 Middle

  • GC Roots: stack variables, static fields, JNI, active threads
  • G1: regions, RSet, CSet, Mixed GC, MaxGCPauseMillis
  • Young GC = Minor GC (Eden + Survivor → Survivor/Old)
  • Full GC = весь Heap, долгая пауза (секунды)
  • ThreadLocal — частая причина утечек (не вызывают .remove())
  • Heap Dump = снимок Heap в бинарном формате (hprof), STW при снятии

🔴 Senior

  • ZGC: Colored Pointers (metadata in pointer bits), Load Barriers, Multi-mapping
  • Shenandoah: Brooks Pointers (forwarding pointer), Load Reference Barriers
  • SATB (Snapshot-At-The-Beginning) — concurrent marking алгоритм
  • Escape Analysis → Scalar Replacement → аллокация на Stack вместо Heap
  • TLAB → lock-free аллокация per thread
  • OopMaps → JIT карта ссылок, GC не сканирует каждый байт стека
  • Allocation Stall — young gen fills faster than concurrent marking finishes

📝 Формат каждого файла

Каждый файл содержит:

  • 🟢 Junior Level — базовое понимание, простые аналогии, примеры
  • 🟡 Middle Level — внутренности, типичные ошибки, практические примеры
  • 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы