В .net время, необходимое для выполнения сборки мусора, гораздо сильнее зависит от количества вещей, которые не являются мусором, чем от количества вещей, которые есть. Действительно, если объект не переопределяет Finalize
(либо явно, либо через деструктор C #), не является целью WeakReference
, находится в куче больших объектов или не является специальным в каком-либо другом, связанном с gc способе, единственное, что идентифицирует память, в которой он находится как объект, - это наличие корневых ссылок на него. В остальном, работа GC аналогична извлечению из здания всего ценного и его динамическому построению, построению нового на месте старого и помещению в него всех ценных предметов. Усилие, необходимое для динамита здания, полностью не зависит от количества мусора в нем.
Следовательно, вызов GC.Collect
способен увеличить общий объем работы, выполняемой системой. Это задержит появление следующей коллекции, но, вероятно, немедленно выполнит столько же работы, сколько потребовалось бы следующей коллекции, когда это произошло; в тот момент, когда должна была произойти следующая сборка, общее время, потраченное на сбор, будет примерно таким же, как если бы GC.Collect
не был вызван, но система накопит некоторое количество мусора, в результате чего последующий сбор потребуется раньше чем GC.Collect
не был вызван.
Временами, когда я вижу, что GC.Collect
действительно может быть полезен, нужно, когда нужно либо измерить использование памяти каким-либо кодом (поскольку цифры использования памяти действительно имеют смысл только после коллекции), либо определить, какой из нескольких алгоритмов лучше ( вызов GC.Collect () перед запуском каждого из нескольких фрагментов кода может помочь обеспечить согласованное базовое состояние). Есть несколько других случаев, когда кто-то может знать то, чего не знает GC, но если кто-то не пишет однопоточную программу, нет никакого способа узнать, что вызов GC.Collect
, который помог бы структурам данных одного потока избежать "mid" кризис жизни "не приведет к тому, что данные других потоков будут иметь" кризис среднего возраста ", которого в противном случае можно было бы избежать.