Переполнить мою память, чтобы заставить сборщика мусора? - PullRequest
2 голосов
/ 25 сентября 2010

Как я могу преднамеренно переполнить мою память, чтобы вызвать сборку мусора?Может кто-нибудь предложить алгоритм, подобный этому:

while ( garbage collector starts ) {
      overflow my memory with something easily disposable
}

Редактировать: Всем, кто определил метод GC.Collect.Я всегда думал, что GC нельзя заставить происходить программно.Думаю, я был не прав.Спасибо за ответы.

Ответы [ 7 ]

8 голосов
/ 25 сентября 2010

Еще лучше, как насчет использования GC.Collect? Нет необходимости синтезировать условие при наличии явной функции ...

Также обратите внимание на метод GC.WaitForPendingFinalizers, который Адам Батлер (комментарий выше) , ChristopheD ( ответ ниже ) и Майкл Петротта (комментарий ниже) указал, что делает следующий шаг. Страшная цитата из документации по этому методу, однако: «Поток, в котором запускаются финализаторы, не указан, поэтому нет гарантии, что этот метод завершится.» Вздох

4 голосов
/ 25 сентября 2010

Помимо использования GC.Collect: если вам действительно нужно, чтобы сборка мусора выполнялась синхронно ( блокирует другими словами), вы можете использовать GC.WaitForPendingFinalizers: http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx

Обратите внимание, что это может очень излишне временно заморозить ваше приложение.

Ссылка также предоставляет код, который может вызвать сборщик мусора.

2 голосов
/ 25 сентября 2010
1 голос
/ 25 сентября 2010

Вот так, например:

int cnt = GC.CollectionCount(0);
while (GC.CollectionCount(0) == cnt) {
  string s = new String('*', 1000);
}

Тем не менее, это, конечно, будет работать только до тех пор, пока не произойдет сборка мусора, но это может быть не из-за созданных объектов, а по любой причине.

Если вы просто хотите, чтобы сборка мусора происходила, метод GC.Collect сделает это.

Однако редко есть какая-либо причина для принудительного сбора мусора. Коллекции будут появляться по мере необходимости, обычно вы будете снижать производительность только путем форсирования коллекций.

0 голосов
/ 25 сентября 2010

Разве вы не можете просто позвонить в GC.Collect ()

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

0 голосов
/ 25 сентября 2010

Почему бы просто не использовать GC.Collect вместо принудительного сбора мусора?

0 голосов
/ 25 сентября 2010

Есть ли какая-то причина, по которой GC.Collect () не работает для вас?Это заставляет сбор мусора происходить.

...