В .NET очистит ли родительский модуль вложенных словарей всю память при сборе мусора? - PullRequest
3 голосов
/ 31 марта 2010

У меня есть следующие вложенные словари:

  1. Dictionary<int, Dictionary<string, object>> x;
  2. Dictionary<int, SortedDictionary<long, Dictionary<string, object>>> y;

Если я сделаю x.Clear() и y.Clear(), все ли вложенные объекты очистятся и вся память будет повторно использована при следующей сборке мусора?

Или мне нужно перебрать все элементы и очистить их вручную?

Ответы [ 3 ]

4 голосов
/ 31 марта 2010

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

Если это будет сделано при следующей сборке мусора, зависит от поколения, которому они принадлежат.

Эта статья от Джеффри Рихтера многое объясняет.

0 голосов
/ 31 марта 2010

Может быть, да.

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

Но если нет ссылок, то они будут собраны (в какой-то момент).

0 голосов
/ 31 марта 2010

Это одинаково для всех: сборщик мусора начинает с своих корней (переменных в стеке и других нечетных случаях) и обходит дерево достижимых объектов, следуя ссылкам.Любые объекты, не найденные этим процессом, будут иметь право на сбор.

Таким образом, если ваши удаленные под-словари недоступны другим способом, они будут собраны.

...