| layout | default | ||||
|---|---|---|---|---|---|
| title | 🧠 Как организована память в .NET (Stack, Heap, GC)? | ||||
| description | |||||
| author | Dvurechensky | ||||
| date | 2025-08-28 | ||||
| published | true | ||||
| tags |
|
В .NET память делится на две основные области:
| Область | Что хранится | Кто управляет | Особенности |
|---|---|---|---|
| Stack (стек) | Локальные переменные, ссылки на объекты, value types | Компилятор / CLR | Быстрое выделение/освобождение, LIFO, ограниченный размер |
| Heap (куча) | Объекты reference type, boxed value type | GC (Garbage Collector) | Долговременное хранение, управление памятью через сборку мусора, дороже выделение/освобождение |
-
Хранит:
- Локальные переменные value types (
int,struct). - Ссылки на объекты reference type.
- Локальные переменные value types (
-
Особенности:
- LIFO (Last In First Out) — последний вошёл, первый вышел.
- Автоматическое освобождение при выходе из метода.
- Высокая производительность.
-
Пример:
void Foo() { int a = 10; // на стеке object obj = new object(); // ссылка на стек, объект в куче } // стек очищается при выходе из Foo()
-
Хранит:
- Объекты reference type (
class,string, массивы). - Value type, если они упакованы (boxed).
- Объекты reference type (
-
Особенности:
- GC освобождает память.
- Медленнее, чем стек.
- Не LIFO, объекты живут, пока на них есть ссылки.
-
Пример:
class Person { public string Name; } var p = new Person(); // объект в куче, p на стеке содержит ссылку
-
Что делает:
- Автоматически освобождает память, когда объекты больше не используются.
- Оптимизирует размещение объектов.
-
Как работает:
- Generation 0 — молодые объекты, быстро собираются.
- Generation 1 — промежуточные объекты.
- Generation 2 — долгоживущие объекты.
- Large Object Heap (LOH) — объекты >85 000 байт, собираются реже.
-
Триггеры сборки:
- Недостаток памяти.
- Задания сборки через
GC.Collect()(редко и не рекомендуется).
-
Mark (Пометить)
- GC отмечает все живые объекты (которые доступны через ссылки).
-
Sweep (Очистить)
- Освобождает память для неиспользуемых объектов.
-
Compact (Компактация)
- Уплотняет кучу, чтобы уменьшить фрагментацию.
-
Generation promotion
- Если объект пережил несколько сборок → повышается в поколении (0 → 1 → 2).
-
Value type, помещённый в объект:
- Появляется на куче.
- GC управляет его жизненным циклом.
-
Пример:
int x = 10; object obj = x; // boxing int y = (int)obj; // unboxing
- Immutable reference type.
- Хранится в куче.
- String interning — одинаковые литералы могут ссылаться на один объект.
- Любое изменение создаёт новый объект в куче.
-
Stack vs Heap
- Почему value type на стеке? Почему reference type на куче?
- Как стек очищается автоматически, а heap — через GC?
-
Boxing / Unboxing
- Как влияет на производительность и память?
- Где хранится упакованный value type?
-
Generations
- Почему молодые объекты собираются чаще?
- Что такое LOH?
-
GC.Collect()
- Можно ли принудительно вызвать GC? Когда это оправдано?
-
Memory leaks
- Как можно допустить утечку памяти в managed среде? (События, статические ссылки)
-
Allocation speed
- Stack быстрее heap?
- Почему?
-
Reference counting vs tracing GC
- .NET использует tracing GC (не подсчет ссылок), вопросы о циклах ссылок.
-
Pinned objects
- Для interop с unmanaged кодом (
fixed,GCHandle).
- Для interop с unmanaged кодом (
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✨