24

У меня возникла проблема, из-за которой, если моя система работает в течение нескольких дней без перезагрузки, я получу предупреждение "Закрытие программ для предотвращения потери информации", а затем появится диалоговое окно с предложением закрыть программы, которые можно либо отменить, либо нажать "закрыть программы" и Windows принудительно закроет некоторые или все приложения, перечисленные в диалоговом окне.

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

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

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

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

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

3 ответа3

15

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 допустила, что плата за коммит превысила объем доступного пространства, чтобы реализовать это пространство, то это ожидание не всегда могло быть удовлетворено.

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

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

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

14

Дикие догадки здесь.

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

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

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

Как я уже сказал, дикая догадка.

-2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .