TGViewer
НеСерьезный шарпист НеСерьезный шарпист @serious_seesharp · 2.4K subscribers
Post #78 4.34K

Forwarded from Папочка Разработки (Aleksandr Alekseev)

Утечки памяти в .NET 🐒

Слышал различные мнения на этот счёт и то, что это всё не утечки и их в дотнете не существует, но давайте посмотрим на определение из вики:

Уте́чка па́мяти (англ. memory leak) — процесс неконтролируемого уменьшения объёма свободной оперативной или виртуальной памяти компьютера, связанный с ошибками в работающих программах, вовремя не освобождающих память от ненужных данных


Иначе говоря простыми словами, утечка памяти — это сценарий, когда память не освободилась, а должна была. Давайте прикинем как такое возможно в дотнете на примере трёх не самых очевидных вариантов🥰

1. Забытые подписки на события
Пока у события есть подписчики оно не будет очищено сборщиком мусора.
public class EventPublisher
{
public event EventHandler SomeEvent;

public void RaiseEvent()
{
SomeEvent?.Invoke();
}
}

public class Subscriber
{
public Subscriber(EventPublisher publisher)
{
// Подписываемся на событие
publisher.SomeEvent += OnSomeEvent;
// Но никогда не отписываемся!
}

private void OnSomeEvent(object sender, EventArgs e)
{
Console.WriteLine("Event received");
}
}


2. Статические поля и коллекции
Статические поля живут на протяжении всего времени работы приложения. Если они содержат ссылки на большие объекты или продолжают расти, это может привести к утечкам:

public static class Cache
{
// Эта коллекция будет только расти
private static readonly Dictionary<string, object> _items = new Dictionary<string, object>();

public static void Add(string key, object value)
{
_items[key] = value;
}

public static object Get(string key)
{
return _items.TryGetValue(key, out var value) ? value : null;
}
}


3. Замыкания и захват переменных
Анонимные методы и лямбда-выражения могут захватывать переменные из внешней области видимости, что иногда приводит к неожиданным утечкам:

public class LambdaExample
{
public Action CreateLongLivingAction()
{
// Этот массив будет жить до тех пор, пока жив возвращаемый делегат
var largeArray = new byte[1000000];

return () =>
{
Console.WriteLine(largeArray.Length);
};
}
}


Лайк, шер, ретвит и, может быть, когда-нибудь техника полностью меня одолеет 🌟
  • ❤‍🔥 26
  • 👍 18
  • 🔥 5
  • ❤ 3
More from @serious_seesharp
  1. Jul 11, 2026Знакомый создал бота @booster_tbot, для прохождения мок-собесов бесплатно, а вопросы основ…
  2. Jun 30, 2025Всем, привет! Мы сейчас начинаем отбор докладов на осеннюю конфу "Стачка" в Питере. Если у…
  3. Jun 28, 2025Столкнулся с тем, что, как выяснилось, не всем очевидно для чего нужен ValueTask и когда е…
  4. Jun 5, 2025Post #85
  5. May 24, 2025Давно хотел сделать розыгрыш, и вот, кажется, время настало 🥰 Не надо никуда ничего скиды…
  6. May 23, 2025👩‍💻 Когда в C# 12 появились primary constructors (первичные конструкторы класс/структур)…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →