2010-06-19 4 views
5

Возможно ли программисту запустить/остановить сборку мусора на языке программирования C#? Например, для оптимизации производительности и т. Д.Можно ли остановить сборку мусора .NET?

+1

Сбор мусора не является частью языка программирования C#. Это часть .NET CLR. –

+0

"Kinda". Если вы никогда ничего не выделяете, GC никогда не будет собирать. Предварительно выделите все, что вам нужно, а затем вызовите 'GC.Collect()'. –

+0

Возможно, также взгляните на этот ответ: http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time/6005949#6005949 – Gamlor

ответ

6

Не совсем. Вы можете дать подсказки GC с помощью таких методов, как GC.AddMemoryPressure или GC.RemoveMemoryPressure, но не останавливайте его прямо.

Кроме того, сбор мусора не является настолько интенсивным процессом. Программисты очень редко об этом беспокоятся.

+0

О, я вижу ... Как насчет метода SuppressFinalize()? У него другая цель? – Alex

+0

SuppressFinalize работает над отдельными объектами. Определенно не во всей ГК. Из MSDN: Объекты, реализующие интерфейс IDisposable, могут вызывать этот метод из метода IDisposable.Dispose, чтобы предотвратить сборщик мусора от вызова Object.Finalize на объект, который этого не требует. (Так что в основном это очень небольшое повышение производительности.) –

+0

Я не вижу, как это будет добавление намека на * предотвращение * сбор мусора, per se; если вы вызываете 'GC.AddMemoryPressure', то это, скорее всего, приведет к тому, что CLR будет создавать * больше * сборщиков мусора, поскольку это указывает на то, что память, доступная для CLR для процесса (виртуальная или нет), меньше, чем она думает. Один * может * вызывать 'GC.RemoveMemoryPressure' без соответствующего вызова' GC.AddMemoryPressure', пытаясь обмануть CLR, думая, что у него больше памяти, чем у него, но можно подумать, что API устойчив (один надеюсь) на такие вещи. – casperOne

3

Нет, нет. В лучшем случае вы можете запускать сборку мусора самостоятельно, хотя это считается очень плохой вещью, поскольку это может помешать встроенным алгоритмам планирования, используемым GC.

+0

Вы не можете активировать сбор , просто может «предложить». GC сам решит –

4

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

Если вы заинтересованы в том, чтобы настроить GC на производительность (или, более вероятно, настроить ваше приложение, чтобы улучшить его производительность по сравнению с GC), MSDN имеет довольно приличное описание способов его выполнения.

4

Между тем, это возможно, существуют методы в GCclass:

GC.TryStartNoGCRegion(...) и GC.EndNoGCRegion().

Смежные вопросы