Обзор вопросов по языка програмиированию C# и технологии NET
В .NET память делится на две основные области:
Область | Что хранится | Кто управляет | Особенности |
---|---|---|---|
Stack (стек) | Локальные переменные, ссылки на объекты, value types | Компилятор / CLR | Быстрое выделение/освобождение, LIFO, ограниченный размер |
Heap (куча) | Объекты reference type, boxed value type | GC (Garbage Collector) | Долговременное хранение, управление памятью через сборку мусора, дороже выделение/освобождение |
Хранит:
int
, struct
).Особенности:
Пример:
void Foo()
{
int a = 10; // на стеке
object obj = new object(); // ссылка на стек, объект в куче
} // стек очищается при выходе из Foo()
Хранит:
class
, string
, массивы).Особенности:
Пример:
class Person { public string Name; }
var p = new Person(); // объект в куче, p на стеке содержит ссылку
Что делает:
Как работает:
Триггеры сборки:
GC.Collect()
(редко и не рекомендуется).Mark (Пометить)
Sweep (Очистить)
Compact (Компактация)
Generation promotion
Value type, помещённый в объект:
Пример:
int x = 10;
object obj = x; // boxing
int y = (int)obj; // unboxing
Stack vs Heap
Boxing / Unboxing
Generations
GC.Collect()
Memory leaks
Allocation speed
Reference counting vs tracing GC
Pinned objects
fixed
, GCHandle
).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✨