Программно вызвать сборщик мусора - PullRequest
2 голосов
/ 17 декабря 2009

Есть ли способ вызвать сборщик мусора для определенного объекта в управляемой памяти из приложения?

например. (в псевдокоде)

Read myString from file;
perform arbitrary operation on myString;
invoke garbage-collector to remove myString

Ответы [ 7 ]

7 голосов
/ 17 декабря 2009

GC.Collect () он скажет ему запустить коллекцию. Но он не будет собирать конкретные объекты. GC недетерминирован в отношении того, какие объекты собираются или нет, и когда.

5 голосов
/ 17 декабря 2009

Нет, и это ни на что не повлияет:

Думайте об этом так. Скажем, у вас есть пользовательский класс MyBigMemoryClass, для которого вы хотите собрать экземпляр - у вас должен быть какой-то способ передать ссылку на это сборщику мусора. В теоретическом мире это было бы что-то вроде:

// Not valid code!
MyBigMemoryClass instance = GetMyInstance();
GC.CollectObject(instance);

Однако на данный момент у вас все еще есть ссылка на экземпляр вашего класса в переменной instance, поэтому объект по-прежнему укоренен и не является кандидатом на сборку мусора . GC увидит, что он укоренен, и оставит его.

Самое близкое, что вы можете сделать, - это отключить экземпляр вашего объекта, а затем заставить сборщик мусора попытаться собрать все:

MyBigMemoryClass instance = GetMyInstance();
// Do something with instance
instance = null; // Unroot this, so there are (hopefully) no references to it left
GC.Collect(); // Collect everything

При этом, как правило, это очень плохая идея. Гораздо лучше никогда не вызывать сборщик мусора и позволить ему управлять памятью за вас. Существует очень немного исключений, в основном при работе с собственным кодом, и эти исключения обычно обрабатываются лучше с помощью GC.AddMemoryPressure и GC.RemoveMemoryPressure .

4 голосов
/ 17 декабря 2009

В настоящее время * нет управляемого API для вызова GC для определенного объекта.

на 17 декабря 2009 г .: .NET 3.5 SP1 и .NET 4.0 Beta 2 не имеют его.

4 голосов
/ 17 декабря 2009

В сборщике мусора есть метод Collect, но его следует избегать в 99,999% случаев по соображениям производительности. Трудно предсказать правильное время для очистки этих объектов.

http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx

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

Чтобы добавить к другим замечательным ответам ...

Имейте в виду, что очень маловероятно, что вам действительно нужно вызвать GC.Collect () самостоятельно. Сборщик мусора очень умен и знает, когда делать свое дело. См. сообщение Скотта Холдена о GC для получения дополнительной информации.

0 голосов
/ 17 декабря 2009

Вам это не нужно, если это строка.
Он будет собран, когда вы убедитесь, что на нем нет ссылок.

Для принудительной сборки мусора вы можете создать класс, реализующий интерфейс IDisposable, обеспечить необходимую реализацию, использовать этот класс в коде и освободить его, вызвав для него Dispose.

, например

using (WrapsTheStringAndIsDisposable blah = new WrapsTheStringAndIsDisposable())
{
  .....
}

Я бы сказал, не волнуйтесь об этом.

0 голосов
/ 17 декабря 2009

Насколько мне известно, невозможно быть таким конкретным с коллекцией с C #.

Это часто упоминается как один из минусов C # по сравнению с C / C ++.

Тем не менее, было бы интересно узнать, почему вы хотите это сделать, это звучит немного как преждевременная работа производительности. Много замечательных советов против этого в интересной книге, которую я сейчас читаю, «Кодеры на работе».

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