Skip to content

Latest commit

 

History

History
240 lines (160 loc) · 9.13 KB

File metadata and controls

240 lines (160 loc) · 9.13 KB
layout default
title 🧠 Как организована память в .NET (Stack, Heap, GC)?
description
author Dvurechensky
date 2025-08-28
published true
tags
Stack
Heap
GC
C#

🧠 Как организована память в .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 (Стек)

  • Хранит:

    • Локальные переменные value types (int, struct).
    • Ссылки на объекты reference type.
  • Особенности:

    • LIFO (Last In First Out) — последний вошёл, первый вышел.
    • Автоматическое освобождение при выходе из метода.
    • Высокая производительность.
  • Пример:

    void Foo()
    {
        int a = 10; // на стеке
        object obj = new object(); // ссылка на стек, объект в куче
    } // стек очищается при выходе из Foo()

3️⃣ Heap (Куча)

  • Хранит:

    • Объекты reference type (class, string, массивы).
    • Value type, если они упакованы (boxed).
  • Особенности:

    • GC освобождает память.
    • Медленнее, чем стек.
    • Не LIFO, объекты живут, пока на них есть ссылки.
  • Пример:

    class Person { public string Name; }
    var p = new Person(); // объект в куче, p на стеке содержит ссылку

4️⃣ Garbage Collector (GC)

  • Что делает:

    • Автоматически освобождает память, когда объекты больше не используются.
    • Оптимизирует размещение объектов.
  • Как работает:

    • Generation 0 — молодые объекты, быстро собираются.
    • Generation 1 — промежуточные объекты.
    • Generation 2 — долгоживущие объекты.
    • Large Object Heap (LOH) — объекты >85 000 байт, собираются реже.
  • Триггеры сборки:

    • Недостаток памяти.
    • Задания сборки через GC.Collect() (редко и не рекомендуется).

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

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

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

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

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

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

6️⃣ Boxed value types

  • Value type, помещённый в объект:

    • Появляется на куче.
    • GC управляет его жизненным циклом.
  • Пример:

    int x = 10;
    object obj = x; // boxing
    int y = (int)obj; // unboxing

7️⃣ String и память

  • Immutable reference type.
  • Хранится в куче.
  • String interning — одинаковые литералы могут ссылаться на один объект.
  • Любое изменение создаёт новый объект в куче.

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✨