Сценарий 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.
Это эксперимент, который вызвал этот вопрос: одна часть приложения использовала большие массивы структур (каждая структура имела два примитивных поля).Я изменил эту структуру на класс, и в результате размер кучи со временем увеличивался не так быстро.Похоже, что это изменение улучшило сборку мусора кучи, а также общее использование памяти.
Насколько я понимаю, массив хранится в куче, даже если это массив примитивов.Тогда я не понимаю, почему изменение содержимого массива из структуры в класс может повлиять на сборку мусора в куче.
Когда у меня большой массив примитивов, используется ли какая-либо стековая память?Если бы я создал класс с одним примитивным полем и сохранил массив этого класса вместо массива примитивов, могу ли я разумно ожидать те же улучшения в использовании памяти, которые я увидел, когда я изменил свою структуру на класс?