Диспетчер задач в Windows: вкладка «Память» - PullRequest
0 голосов
/ 08 марта 2019

Я создал очень простую программу и настроил на моем компьютере ограниченный объем виртуальной памяти.ОЗУ 32 ГБ и виртуальная память 4 ГБ.Затем я создал код C # для использования всей памяти NET.

List<HeapSizeAllocation> hsaList = new List<HeapSizeAllocation>();

public class HeapSizeAllocation
    {

        int[] _arr;
        int s1Gb = ( 1024 * 1024 * 1024) /sizeof(int); //1GB = 1024MB 1MB= 1024Kb 

        public void Test()
        {

            //Test simple array allocation
            _arr = new int[s1Gb * 2];

        }
    }

Нажмите () => Повторять, пока не будет выброшено OutOfMemory

 HeapSizeAllocation hsa = new HeapSizeAllocation();
                hsaList.Add(hsa);

                hsa.Test();

Затем я открываю TaskManager в Windows и все еще вижу 21ГБ бесплатно, всего 10 в использовании.Зачем?enter image description here

1 Ответ

1 голос
/ 01 мая 2019

4 ГБ, указанные вами в настройках «Свойства системы», на самом деле соответствуют размеру разрешенного файла (ов) подкачки. К сожалению, этот параметр называется «Виртуальная память», поскольку он вызывает путаницу с тем, что на самом деле означает понятие виртуальная память .

2 важные вещи, которые нужно иметь в виду:

  • Виртуальное адресное пространство по умолчанию для процесса для проекта C #, созданного с помощью Visual Studio на Windows xbox, будет ограничено до 4 ГБ из-за настройки по умолчанию Platform target по умолчанию. Вы должны изменить это (например, чтобы скомпилировать для платформы x64), чтобы увидеть больше используемых
  • Пока вы только распределяете данные, но никак не касаетесь их, рабочий набор (а именно, сколько ОЗУ фактически используется вашими данными) будет оставаться довольно низким

Я написал статью специально для сценария, на который вы ссылаетесь (из-за нехватки памяти на машине с большим количеством оперативной памяти, но все еще остается много памяти) здесь . Это объясняет вещи в деталях.

...