Array [Struct] vs Array [Class] сборка мусора в .Net / C # - PullRequest
0 голосов
/ 13 октября 2018

Сценарий A:

var intArray = Enumerable.Range(1, 1234567890).ToArray();

Сценарий B:

class myIntClass{ public int myInt { get; set; } }

var arrayOfClasses = Enumerable.Range(1, 1234567890)
.Select(i => new myIntClass() { myInt = i });

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

Звучит как глупый вопрос, я бы предположил, что массив примитивов будет очевидным выбором.

Однако ... Я работаю с некоторыми очень большими массивами и коллекциями примитивных типов.Это приложение предназначено для запуска «навсегда», но использование памяти со временем увеличивается, и я не могу понять, почему.Я провел некоторый анализ с помощью средств диагностики VS и профилировщика CLR.

Согласно статистике использования памяти средствами диагностики VS, куча не увеличивается с той же скоростью, что и показатель общего использования памяти, который я вижу в Задаче.Manager.

Это эксперимент, который вызвал этот вопрос: одна часть приложения использовала большие массивы структур (каждая структура имела два примитивных поля).Я изменил эту структуру на класс, и в результате размер кучи со временем увеличивался не так быстро.Похоже, что это изменение улучшило сборку мусора кучи, а также общее использование памяти.

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

Когда у меня большой массив примитивов, используется ли какая-либо стековая память?Если бы я создал класс с одним примитивным полем и сохранил массив этого класса вместо массива примитивов, могу ли я разумно ожидать те же улучшения в использовании памяти, которые я увидел, когда я изменил свою структуру на класс?

...