Коллекции .NET и куча больших объектов (LOH) - PullRequest
10 голосов
/ 30 марта 2009

Можно ли хранить коллекции в .NET с большим количеством элементов в LOH?

Мне любопытно, в частности, список и словарь. В моем коде я храню большое количество (более 40 тыс.) Относительно небольших объектов (скажем, 1 тыс.) Во временных списках и словарях для обработки. Увеличивает ли количество предметов в этих коллекциях вероятность попадания в LOH?

Для списка, если предположить, что List реализован как двусвязный список, то количество элементов не должно увеличивать размер фактического объекта List, но я бы хотел знать наверняка.

Спасибо

Ответы [ 4 ]

13 голосов
/ 30 марта 2009

Объекты будут храниться на LOH только в том случае, если их размер превышает 85 000 байт. Большой список (особенно структур) часто будет выделяться здесь.

Однако словарь менее вероятен, поскольку он хранит массив сегментов, поэтому, если генерировать достаточно сегментов, чтобы массив стал> 85000 байт, это маловероятно. Список из 40 тыс. Элементов будет храниться в LOH, даже если они являются классами (поскольку ссылки на объекты в каждом элементе приведут к тому, что список будет 160 тыс. В x86, 320 тыс. В системах x64). Отдельные элементы будут в стандартной куче, поэтому будут уплотнены и т. Д.

Если вы используете двусвязный список вместо стандартного списка, маловероятно, что он будет сохранен в LOH. Каждый элемент списка будет небольшим (всего один узел со ссылками на следующие / предыдущие узлы), поэтому ни один объект не будет иметь размер> 85 Кбайт.

Для получения подробной информации о LOH, это отличная запись в блоге.

4 голосов
/ 30 марта 2009

Список реализован в виде массива. Таким образом, массив будет помещен в LOH, но сам объект List не будет.

То же самое в основном относится и к словарю. Он также использует внутренний массив, который в основном хранит добавленные пары ключ / значение.

4 голосов
/ 30 марта 2009

System.Collections.Generic.List реализован как массив внутри, а не как связанный список. И да, если размер коллекции большой, она будет размещена в куче больших объектов (обратите внимание, что размер массива важен, если у вас небольшой массив больших ссылочных типов, он не будет размещен на LOH ).

0 голосов
/ 30 марта 2009

Словарь имеет вектор O (LOG N) для ключа / значения, поэтому в 40K + объектах вы довольно безопасно. Как уже было сказано выше, List реализован в виде массива, поэтому большой список действительно находится на LOH. Вы можете проверить, находится ли ваш объект на LOH, используя SOS .

...