Re your last Q - короткая версия: сообщение об ошибке о "подтвержденном" виртуальном адресном пространстве. Если вы посмотрите на график Commit Charge во втором снимке экрана, то увидите, что он действительно находится на пределе или приближается к нему.
Количество ОЗУ, которое "свободно", "доступно" или "используется", не имеет значения. В частности, нехватка "доступной" оперативной памяти абсолютно не является причиной сообщения "недостаточно памяти" или "недостаточно памяти".
Лимит фиксации равен общему объему памяти и размеру файла подкачки. Когда выделенная память распределяется, она немедленно заряжается для "фиксации заряда", даже если она еще не использовалась ... это означает, что оперативная память или пространство PF не используются немедленно. Физическое пространство (будь то в ОЗУ или в файле подкачки) используется только тогда, когда на память фактически ссылаются. С этого момента оно должно иметь место, пока программа не освободит его, или весь процесс не закончится.
Пример: предположим, что у вас нет файла подкачки, следовательно, ваш предел фиксации составляет 16 ГБ (ваш объем ОЗУ). Теперь предположим, что 8 процессов каждый пытается VirtualAlloc (MEM_COMMIT) 1 ГБ. Результат: плата за коммит увеличена на 8 ГБ. Однако непосредственное влияние на оперативную память нет! Как будто вы купили блокнот в магазине канцелярских товаров, но на самом деле вы не получили никакой бумаги. Каждый раз, когда вам нужен новый лист, он появляется волшебным образом. Пока вы не израсходуете весь пэд (размер выделенного региона).
Теперь предположим, что каждый из этих процессов имеет доступ только к 100 МБ из 1 ГБ. Объем используемой оперативной памяти составляет всего 800 МБ.
Но поскольку каждый из них может ссылаться на все свои 1 ГБ, ОС должна гарантировать, что 8 ГБ ОЗУ + пространство подкачки ... ну, просто ОЗУ в случае отсутствия подкачки ... остается доступным на случай, если это произойдет , Возвращаясь в магазин канцелярских товаров, им нужно хранить достаточно бумаги на складе, чтобы дать каждому столько листов, сколько они купили ранее.
Соответственно, ОС должна прекратить разрешать успешное выполнение VirtualAlloc(MEM_COMMIT), когда текущее зафиксированное количество достигает предела.
Зачем? Поскольку процесс, как ожидают, проверит результат VirtualAlloc, чтобы видеть, успешно ли это. После того, как он сделал это и обнаружил, что alloc успешно завершен, процесс имеет полное право ожидать, что его последующие ссылки на весь зафиксированный регион будут успешными.
Если Windows допустила, что плата за коммит превысила объем доступного пространства, чтобы реализовать это пространство, то это ожидание не всегда могло быть удовлетворено.
Быстрый обходной путь - увеличить (по умолчанию) начальный размер вашего файла подкачки. Из приведенного выше объяснения вы сможете понять, почему это позволит избежать появления сообщения об ошибке, даже если в этот файл ничего не может быть записано. Опять же, ОС гарантирует, что место для всей платы за коммит будет доступно в случае необходимости. Когда процессы выделяют выделенную память, они просто говорят: «Эй, ОС, мне может понадобиться так много». Это не значит, что они на самом деле будут его использовать, и, конечно же, это не значит, что они на самом деле его уже использовали.
Для получения дополнительной информации см. Мой ответ здесь.
Теперь .... почему вы используете столько коммитов, когда ваши процессы, кажется, не складываются в него, это другой вопрос. Чтобы начать это, откройте вкладку «Быстродействие» диспетчера задач в разделе «Память».