.net Сборка мусора и управляемые ресурсы - PullRequest
4 голосов
/ 29 января 2009

Память из примитивных типов данных (int, char и т. Д.) Немедленно освобождается после того, как они покидают область действия, или добавляется в сборщик мусора для последующего выпуска?

рассмотреть следующие вопросы:

For x as integer=0 to 1000
dim y as integer
Next

Если это не добавляет 1000 целых чисел к сборщику мусора для очистки позже, как это относится к строковым объектам? это создаст 1000 строк для очистки позже?

For x as integer=0 to 1000
dim y as string=""
Next

Как насчет структур, которые содержат только типы данных int, string и т.д ...?

Классы, которые содержат только управляемые ресурсы?

Ответы [ 3 ]

7 голосов
/ 30 января 2009

Хорошо, только с двумя ответами уже есть дезинформация ...

  • Строка не является примитивным типом
  • Строка не является типом значения
  • Значения типа значения не всегда создаются в стеке - это зависит от того, где находится переменная. Если он является частью класса, он сохраняется в куче вместе с остальными данными для этого объекта.
  • Даже локальные переменные могут оказаться в куче, если они захвачены (например, в анонимных функциях и блоках итераторов)
  • Строковые литералы, такие как "", интернированы - они всегда разрешаются в одну и ту же строку. Этот цикл фактически не создает никаких строк.

Для получения дополнительной информации см. Мою статью о Что происходит в памяти .NET . Вы также можете подумать важно ли это или нет .

4 голосов
/ 30 января 2009

Примитивные типы данных (кроме строки) являются типами значений и создаются в стеке, а не в куче. Они выталкиваются из стека, когда выходят из области видимости; они не мусор.

Строки являются ссылочными типами, размещаются в куче и являются сборщиком мусора. .NET выполняет некоторые оптимизации управления памятью строк, используя String Interning . (т. е. у вас, вероятно, будет только один экземпляр строки "" в памяти. .NET может сделать это, поскольку строки неизменны)

1 голос
/ 30 января 2009

Имея два приведенных ответа, я мало что могу добавить, кроме этой статьи , которая дает хорошее описание того, как сборка мусора работает в .Net.

...