C # Сборка мусора Сбор - PullRequest
       5

C # Сборка мусора Сбор

0 голосов
/ 12 июня 2018

Итак, я играл с C # Garbage Collection и заметил очень странную вещь.

Random r = new Random();
byte inl = 0;
while(true)
{
    inl = (byte)r.Next(0, 255);
    Console.WriteLine(inl);
    GC.Collect(0, GCCollectionMode.Forced, false, false);
}

У меня был этот код в основном цикле.Без функции GC.Collect программа работала с 10 МБ ОЗУ.Но с функцией GC.Collect она работает с 6 МБ ОЗУ.

И тогда возникает мой вопрос, почему GC не удалил переменную автоматически после ее записи в консоль?

1 Ответ

0 голосов
/ 12 июня 2018

Существуют разные способы очистки неиспользуемой памяти на разных языках / платформах.

В земле C ++ у вас есть (например) умные указатели с подсчетом ссылок, которые автоматически вызывают delete на своих указателях, когда их количество достигает нуля,Если вы ожидаете такого поведения в мире .NET, вы будете разочарованы!:)

Модель .NET GC сильно отличается.Чтобы избавить вас от необходимости беспокоиться о ручном управлении вашей памятью, CLR позаботится о том, чтобы отслеживать, какие ссылки используются, и очищает память по мере необходимости.Однако мониторинг и проверка того, какие ссылки используются, является относительно дорогим процессом.Поэтому сборщик мусора не работает непрерывно.Например, он срабатывает, когда возникает нехватка памяти (и в других ситуациях, но это, конечно, упрощение).

Краткий ответ в основном: пусть сборщик мусора выполнит свою работу.Это очень умная и высоко оптимизированная система, и вам редко (если вообще) придется самостоятельно запускать сборку мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...