Можно ли принудительно очистить память в C #? - PullRequest
6 голосов
/ 05 декабря 2009

Я слышал, что C # не освобождает память сразу, даже если вы закончили с этим. Могу ли я заставить C # освободить память?

Я использую Visual Studio 2008 Express. Это имеет значение?

P.S. У меня нет проблем с C # и как он управляет памятью. Мне просто любопытно.

Ответы [ 5 ]

19 голосов
/ 05 декабря 2009

Джим,

Вы правильно слышали. Он периодически очищает память с помощью механизма, называемого сборщиком мусора. Вы можете «форсировать» сборку мусора через вызов, подобный приведенному ниже.

GC.Collect();

Я настоятельно рекомендую вам прочитать эту статью MSDN о сборке мусора .

РЕДАКТИРОВАТЬ 1: "Сила" был в кавычках. Чтобы быть более ясным, как другой плакат, это действительно только предполагает. Вы не можете сделать это в определенный момент времени. Отсюда ссылка на статью о сборке мусора в .Net

РЕДАКТИРОВАТЬ 2: Я понял, что все здесь предоставили только прямой ответ на ваш главный вопрос. Что касается вашего второстепенного вопроса. При использовании Visual Studio 2008 Express все равно будет использоваться .NET Framework, который выполняет сборку мусора. Поэтому, если вы когда-нибудь перейдете на профессиональную версию, у вас останутся те же возможности / ограничения управления памятью.

Редактировать 3: В этой википедии говорится о финализаторах дает несколько хороших советов о том, что делать в финализаторе. В основном, если вы создаете объект, который имеет доступ к критическим ресурсам, или если вы потребляете такой объект, реализуйте IDispose и / или воспользуйтесь оператором using . Использование автоматически вызывает метод Dispose, даже когда генерируются исключения. Это не значит, что вам не нужно давать подсказку финализаторам бега ...

9 голосов
/ 05 декабря 2009

Вы не можете принудительно C # освободить память, но вы можете запросить , что CLR освобождает объекты, на которые нет ссылок, вызывая

System.GC.Collect();

Существует метод WaitForPendingFinalizers, который "приостановит текущий поток, пока поток, который обрабатывает очередь финализаторов, не освободит эту очередь". Хотя вам не нужно это называть.

Как другие предложили, отправляйтесь на MSDN для получения дополнительной информации.

3 голосов
/ 06 декабря 2009

Возможно, вы захотите взглянуть на эту скринкаст ^ с InfoQ.com . Он представляет внутренности из .NET Garbage Collector.

2 голосов
/ 05 декабря 2009

Вы можете заставить сборщик мусора собирать объект без ссылки через

GC.Collect()

Метод. Документация здесь .

0 голосов
/ 05 августа 2016

Вы можете очистить вашу память, используя оба метода:

GC.Collect();
GC.WaitForPendingFinalizers();

Прочитать оба ссылки GC.Collect () и GC.WaitForPendingFinalizers ()

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