TGViewer
Папочка Разработки Папочка Разработки @dotnetdad · 3.03K subscribers
Post #251 7.61K
Утечки памяти в .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);
};
}
}


Лайк, шер, ретвит и, может быть, когда-нибудь техника полностью меня одолеет 🌟
  • 👍 18
  • ❤ 1
More from @dotnetdad
  1. Sep 15, 2026За что отвечает ключевое слово async? У каждого спрашивали на собеседовании про модификато…
  2. Sep 14, 2026Post #394
  3. Sep 4, 2026Специальность + популяризация + высокий доход = темка 🌟 Разработка из серьёзной специализ…
  4. Aug 24, 2026Старшая дочка очень любит смотреть мультики, но этот грёбаный пульт всегда её подставляет…
  5. Aug 20, 2026Post #391
  6. Aug 3, 2026Разработчик, который не перестроится под нейронки, никуда не денется. Он станет таксистом…
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 →