Коллекция вопросов ❓ на собеседовании в C# 🍧

Обзор вопросов по языка програмиированию C# и технологии NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

🧠 Как организована память в .NET (Stack, Heap, GC)?

Typing SVG

Static Badge

✨ Оглавление

⬆ Вернуться к главной


1️⃣ Основная модель памяти в .NET

В .NET память делится на две основные области:

Область Что хранится Кто управляет Особенности
Stack (стек) Локальные переменные, ссылки на объекты, value types Компилятор / CLR Быстрое выделение/освобождение, LIFO, ограниченный размер
Heap (куча) Объекты reference type, boxed value type GC (Garbage Collector) Долговременное хранение, управление памятью через сборку мусора, дороже выделение/освобождение

2️⃣ Stack (Стек)


3️⃣ Heap (Куча)


4️⃣ Garbage Collector (GC)


5️⃣ Стратегия сборки мусора

  1. Mark (Пометить)

    • GC отмечает все живые объекты (которые доступны через ссылки).
  2. Sweep (Очистить)

    • Освобождает память для неиспользуемых объектов.
  3. Compact (Компактация)

    • Уплотняет кучу, чтобы уменьшить фрагментацию.
  4. Generation promotion

    • Если объект пережил несколько сборок → повышается в поколении (0 → 1 → 2).

6️⃣ Boxed value types


7️⃣ String и память


8️⃣ Подводные моменты и вопросы на собесе

  1. Stack vs Heap

    • Почему value type на стеке? Почему reference type на куче?
    • Как стек очищается автоматически, а heap — через GC?
  2. Boxing / Unboxing

    • Как влияет на производительность и память?
    • Где хранится упакованный value type?
  3. Generations

    • Почему молодые объекты собираются чаще?
    • Что такое LOH?
  4. GC.Collect()

    • Можно ли принудительно вызвать GC? Когда это оправдано?
  5. Memory leaks

    • Как можно допустить утечку памяти в managed среде? (События, статические ссылки)
  6. Allocation speed

    • Stack быстрее heap?
    • Почему?
  7. Reference counting vs tracing GC

    • .NET использует tracing GC (не подсчет ссылок), вопросы о циклах ссылок.
  8. Pinned objects

    • Для interop с unmanaged кодом (fixed, GCHandle).

9️⃣ Пример иллюстрации

class Person { public string Name; }

void Foo()
{
    int a = 5;          // stack
    Person p = new();   // p ссылка на stack, объект в heap
    object o = a;       // boxing -> heap
}

Foo(); // a и p исчезают со стека, объект Person ждёт GC

🔟 Таблица для собеса

Понятие Где хранится Кто управляет Особенности
Value type (int, struct) Stack Автоматически Копируется при присваивании
Reference type (class, string) Heap GC Ссылки на стек
Boxed value type Heap GC Превращение value type в object
LOH Heap GC Для больших объектов >85KB
String Heap GC, interning Immutable
GC Gen 0 Heap GC Молодые объекты, частая сборка
GC Gen 1 Heap GC Промежуточные объекты
GC Gen 2 Heap GC Долгоживущие объекты

⬆ Вернуться к главной

✨Dvurechensky✨