Предупреждения о малом объеме памяти в Windows 10 при большом объеме доступной памяти

Предупреждения о малом объеме памяти в Windows 10 при большом объеме доступной памяти

У меня возникла проблема: если моя система работает несколько дней без перезагрузки, я начинаю получать предупреждения типа «Закройте программы, чтобы предотвратить потерю информации», а затем диалоговое окно с предложением закрыть программы. Я могу либо отменить это действие, либо нажать «Закрыть программы», и Windows принудительно закроет некоторые или все приложения, перечисленные в диалоговом окне.

Я открываю диспетчер задач и вижу, что в данный момент используется только около 30% моей памяти:

33% использования

Когда я открываю монитор ресурсов, чтобы посмотреть, сколько выделенной памяти используется конкретными приложениями, я все еще вижу относительно низкое использование памяти:

Монитор ресурсов

У меня эта проблема уже некоторое время, и я пытаюсь найти решение. Я исследовал причины, такие как утечка драйвера, используя poolmon, но никогда не видел в poolmon ничего, что соответствовало бы тому, что другие описывали как красные флаги утечки памяти драйвера. Что меня особенно сбивает с толку, так это то, почему Win10 говорит мне закрыть приложения, когда у меня используется только 33% системной памяти.

решение1

Здесь есть только смелые догадки.

Вы отключили файл подкачки, следуя чьему-то случайному совету по «оптимизации».

У вас есть драйвер ОС, который хочет большой блок последовательной физической памяти. Но он не может его получить, потому что вся физическая память была фрагментирована с течением времени. И поскольку файл подкачки отключен, он не может выполнить дефрагментацию памяти.

Включите файл подкачки.

Как я уже сказал, это всего лишь догадка.

решение2

По поводу вашего последнего вопроса - краткая версия: Сообщение об ошибке касается "зафиксированного" виртуального адресного пространства. Если вы посмотрите на график Commit Charge на втором снимке экрана, вы увидите, что он действительно находится на пределе или очень близок к нему.

Объем оперативной памяти, которая "свободна", "доступна" или "используется", не имеет значения. В частности, нехватка "доступной" оперативной памяти совершенно не является причиной сообщения "low on memory" или "out of memory".

Предел фиксации равен общему размеру RAM + pagefile. Когда выделяется выделенная память, она немедленно заряжается до "commit charge", даже если она фактически еще не была использована... то есть никакое пространство RAM или PF не используется немедленно. Физическое пространство (будь то RAM или pagefile) используется только тогда, когда к памяти фактически обращаются. С этого момента оно должно где-то находиться, пока программа не освободит его или пока весь процесс не завершится.

Пример: Предположим, у вас нет файла подкачки, поэтому ваш лимит на фиксацию составляет 16 ГБ (размер вашей оперативной памяти). Теперь предположим, что 8 процессов каждый пытается VirtualAlloc(MEM_COMMIT) 1 ГБ. Результат: стоимость фиксации увеличивается на 8 ГБ. Однако немедленного влияния на оперативную память не наблюдается! Это как если бы вы купили блокнот в канцелярском магазине, но на самом деле не получили никакой бумаги. Однако каждый раз, когда вам нужен новый лист, он волшебным образом появляется. Пока вы не израсходуете весь блокнот (размер выделенной области).

Теперь предположим, что каждый из этих процессов фактически обращается только к 100 МБ из своего 1 ГБ. ОЗУ будет использоваться только 800 МБ.

Но поскольку каждый из нихмощьссылаться на все его 1 ГБ, ОС должна гарантировать, что 8 ГБ ОЗУ+пространство файла подкачки... ну, просто ОЗУ в случае отсутствия файла подкачки... будут доступны на всякий случай. Возвращаясь к магазину канцелярских товаров, им нужно иметь достаточно бумаги на складе, чтобы выдать всем столько листов, сколько они купили ранее.

Соответственно, ОС должна прекратить разрешать VirtualAlloc(MEM_COMMIT) успешно выполняться, когда текущий объем выделенных ресурсов достигает предела.

Почему? Потому что процесс должен проверить результат VirtualAlloc, чтобы увидеть, был ли он успешным. Как только он это сделал и обнаружил, что alloc был успешным, процесс имеет полное право ожидать, что его последующие ссылки на весь выделенный регион будут успешными.

Если бы Windows позволяла расходам на фиксацию данных превышать объем пространства, доступного для реализации этого пространства, то это ожидание не всегда могло быть выполнено.

Быстрое решение — увеличить размер файла подкачки по умолчанию (=начальный). Из приведенного выше объяснения вы должны понять, почему это позволит избежать сообщения об ошибкедаже если в этот файл ничего не будет записано. Опять же, ОС обеспечивает наличие места для всех коммитов.в случае необходимости. Когда процессы выделяют выделенную память, они просто говорят: «Эй, ОС, ямощьнужно столько-то». Это не значит, что они действительно этим воспользуются, и уж точно не значит, что они уже этим воспользовались.

Для получения дополнительной информации см.мой ответ здесь.

Сейчас....почемувы используете так много коммита, когда ваши процессы, кажется, не добавляют его, это другой вопрос. Чтобы начать смотреть на это, пожалуйста, покажите вкладку «Производительность» диспетчера задач, раздел «Память».

решение3

Другая возможность заключается в том, что вы используете Win10 32-бит, а не 64-бит. Хотя у вас установлено 16 ГБ ОЗУ, существуют ограничения 32-битной ОС, которые делают практическое использование выше 4 нестабильным. Кроме того, ОС будет накладывать жесткие ограничения /на процесс/ на объем запрашиваемой ОЗУ, независимо от физической ОЗУ. Если это так, то вы мало что можете сделать, кроме как перейти на 64-битную ОС или запустить меньше приложений одновременно.

Связанный контент