2014-11-20 5 views
1

Я понимаю, что в Java, если я явно вызываю сборку мусора, все, что вызывает, - это «подсказка» сборщику мусора о том, что коллекция была запрошена.Явное вызов коллекции мусора в .NET

Основываясь на чтении документации здесь: http://msdn.microsoft.com/en-us/library/y46kxc5e(v=vs.110).aspx Я правильно говорю, что это не так в .NET, и что если я вызываю сборку мусора, то запускается сборка мусора?

В документации говорится следующее:

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

Теперь, что для меня подразумевается, что сборщик мусора работает, когда вы звоните ему, или я читаю его неправильно?

Если это всего лишь намек, как работают профилировщики памяти?

Все, что я попросил, сказали мне, что это hint только в .NET. Так что, если это не так, это когда-либо было в предыдущих версиях .NET?

ответ

1

Это зависит от того, как вы запускаете GC.

GCCollectionMode:

Default Значение по умолчанию для этого перечисления, который в настоящее время форсированного.

Forced Задействует сбор мусора немедленно.

Optimized Позволяет сборщику мусора определить, является ли текущее время оптимальным для восстановления объектов.

Если вы вызываете переменную без перегрузки или пропускаете GCCollectionMode.Default, она в настоящее время вынуждает GC, но теоретически это поведение может измениться в будущих версиях .NET.

Если вы пройдете GCCollectionMode.Forced, он запустит GC.

Если вы пройдете GCCollectionMode.Optimized, это всего лишь намек. Я не знаю, насколько серьезно среда исполнения относится к этому намеку.

Поэтому, если вы хотите либо принудительно выполнить GC, либо убедиться, что это всего лишь подсказка, используйте перегрузку Collect(int generation, GCCollectionMode mode).

3

«Старение объекта» - неуклюжий способ сказать, что сборщик мусора поддерживает несколько поколений. Например, настольная версия .NET использует 3 поколения, Compact Framework использует только 1 поколение. Это деталь реализации CLR. Как объекты «возраст», другими словами, живут дольше и выживают коллекции, они перейдут в поколение с более высоким номером. Это оптимизация, GC сделает меньше работы над объектами, которые вряд ли нужно будет собрать.

Так что в случае CF, независимо от того, что вы передаете в качестве аргумента, вся куча собрана. В настольной версии собираются поколения, равные аргументу, а также младшие поколения. Другими словами, GC.Collect (1) будет собирать gen # 0 и gen # 1 и вообще ничего не делать с gen # 2.

+0

Полезная информация - спасибо. – Cheetah

+0

Интересно, как сложно было бы сделать GC GC поддержки поддержки для закрытых классов без полей ссылочного типа [все изменчивые объекты будут застревать на уровне 0]? Преимущества не будут такими большими, насколько это было бы возможно, если бы объекты ссылочного холдинга могли бы продвигать или если бы GC мог знать, что объект-контрольный холдинг является неизменным, но я думаю, что некоторые разумные выгоды могут быть относительно дешевыми , – supercat