TGStat
TGStat
Введите текст для поиска
Расширенный поиск каналов
  • flag Russian
    Язык сайта
    flag Russian flag English flag Uzbek
  • Вход на сайт
  • Каталог
    Каталог каналов и чатов Региональные подборки Тематические подборки Платные каналы Поиск каналов
    Добавить канал/чат
  • Рейтинги
    Рейтинг каналов Рейтинг чатов Рейтинг публикаций
    Рейтинги брендов и персон
  • Аналитика
  • Поиск по публикациям
  • Мониторинг Telegram
  • Продвижение
    Реклама через Яндекс Бизнес Реклама в каналах через TGStat Agency Реклама на сайте TGStat.ru
НеСерьезный шарпист

25 Feb 2025, 17:33

Открыть в Telegram Поделиться Пожаловаться

Репост из: Папочка Разработки
Утечки памяти в .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 _items = new Dictionary();

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);
};
}
}

Лайк, шер, ретвит и, может быть, когда-нибудь техника полностью меня одолеет 🌟

1.1k 0 32 2 39
Каталог
Каталог каналов и чатов Подборки каналов Поиск каналов Добавить канал/чат
Рейтинги
Рейтинг каналов Telegram Рейтинг чатов Telegram Рейтинг публикаций Рейтинги брендов и персон
API
API статистики API поиска публикаций API Callback
Наши каналы
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Почитать
Академия TGStat Исследование Telegram 2019 Исследование Telegram 2021 Исследование Telegram 2023
Контакты
Справочный центр Поддержка Почта Вакансии
Всякая всячина
Пользовательское соглашение Политика конфиденциальности Публичная оферта
Наши боты
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot