Память и 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 существуют?
- Что такое memory leak и как его обнаружить?
- Какие инструменты помогают анализировать память?
- Что такое heap dump?
- Как получить heap dump?
- Что такое GC roots?
- Что такое reachability в контексте GC?
- Можно ли вручную вызвать GC?
- Почему не стоит вызывать System.gc()?
Навигатор по разделу
28 вопросов для подготовки к собеседованию на Middle/Senior Java Developer.
📋 Все вопросы
🗺️ Карта зависимостей тем
┌──────────────────────────────────────────┐
│ ПАМЯТЬ 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
- 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы