Розділ 3 · 28 питань

Пам'ять та Garbage Collection

28 питань і відповідей у розділі Пам'ять та Garbage Collection.

Ukrainian Пам'ять та 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. Що таке витік пам’яті і як його виявити?
  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   │        │ ДІАГНОСТИКА    │        │ 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: Об’єкти просуваються з 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 (метадані в бітах вказівника), Load Barriers, Multi-mapping
  • Shenandoah: Brooks Pointers (forwarding pointer), Load Reference Barriers
  • SATB (Snapshot-At-The-Beginning) — алгоритм конкурентного маркування
  • Escape Analysis → Scalar Replacement → алокація на Stack замість Heap
  • TLAB → lock-free алокація per thread
  • OopMaps → JIT карта посилань, GC не сканує кожен байт стека
  • Allocation Stall — young gen заповнюється швидше, ніж конкурентне маркування завершує

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

Кожен файл містить:

  • 🟢 Junior Level — базове розуміння, прості аналогії, приклади
  • 🟡 Middle Level — нутрощі, типові помилки, практичні приклади
  • 🔴 Senior Level — deep dive, edge cases, production досвід, моніторинг
  • 🎯 Шпаргалка для інтерв’ю — ключові тези, часті запитання, червоні прапорці, пов’язані теми