Пам'ять та Garbage Collection
28 питань і відповідей у розділі Пам'ять та Garbage Collection.
Питання цього розділу
- В чому різниця між Heap та Stack?
- Що зберігається в Heap?
- Що зберігається в Stack?
- Що таке Garbage Collection?
- Коли об’єкт стає кандидатом на видалення GC?
- Що таке витік пам’яті в Java?
- Як може статися витік пам’яті в Java?
- Що таке покоління в GC (young, old, metaspace)?
- Що таке Young Generation?
- Що таке Old Generation (Tenured)?
- Що таке Metaspace (або PermGen)?
- Які алгоритми GC існують?
- Що таке G1 GC?
- Що таке ZGC?
- Що таке Shenandoah GC?
- Що таке stop-the-world?
- Які GC мінімізують stop-the-world паузи?
- Що таке параметри -Xms та -Xmx?
- Що станеться при OutOfMemoryError?
- Які типи OutOfMemoryError існують?
- Що таке витік пам’яті і як його виявити?
- Які інструменти допомагають аналізувати пам’ять?
- Що таке heap dump?
- Як отримати heap dump?
- Що таке GC roots?
- Що таке reachability в контексті GC?
- Чи можна вручну викликати GC?
- Чому не варто викликати 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 досвід, моніторинг
- 🎯 Шпаргалка для інтерв’ю — ключові тези, часті запитання, червоні прапорці, пов’язані теми