Коллекции .NET и большая объектная куча (LOH)

Являются ли коллекции .NET с большим количеством предметов, склонных к хранению в LOH?

Я любопытно список и словарь конкретно. В моем коде я сохраняю большое количество (40k) относительно небольших объектов (позволяет сказать 1k) во временных списках и словарях для обработки. Увеличивает ли количество предметов в этих коллекциях вероятность того, что их поставят на ЛОГ?

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

Спасибо

Ответ на: "Коллекции .NET и большая объектная куча (LOH)"

Количество ответов:4

System.Collections.Generic.List is implemented as an array internally, not a linked list. And yes, if the size of the collection is large it'll be allocated on large object heap (note that the size of the array is important, if you have a small array of large reference types, it won't be allocated on LOH). реализуется как внутренний массив, а не связанный список. И да, если размер коллекции большой, он будет выделен на большой объект кучи (обратите внимание, что размер массива имеет важное значение, если у вас есть небольшой массив больших типов ссылок, он не будет выделен на LOH).

Список

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

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

Объекты

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

Однако, словарь менее вероятно, так как они хранения массива ведра, так что если генерировать достаточное количество ведер, чтобы массив становится sgt;85000 байтов, это маловероятно. Список элементов 40k будет храниться на LOH, даже если они классы (так как объект ссылки в каждом элементе приведет к списку, чтобы быть 160k на x86, 320k на x64 систем). Индивидуальные элементы будут на стандартной кучи, хотя, так будет получить уплотняется, и т.д.

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

Для получения подробной информации о ЛОГ, this is a great blog entry.

Вы можете проверить, если вы object is on the LOH using SOS. .

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