Почему Windows всегда использует столько виртуальной памяти, сколько установлено оперативной памяти?

Почему Windows всегда использует столько виртуальной памяти, сколько установлено оперативной памяти?

И почему он хочет иметь максимум в два раза больше этого объема? Моя система имеет 32 ГБ ОЗУ, а Windows по умолчанию устанавливает минимум 16 МБ виртуальной памяти, выделяет 32 ГБ (!) и рекомендует 50 ГБ (!!). Еще хуже в системе с 64 ГБ ОЗУ, где рекомендуется выделить более 100 ГБ, хотя она «только» снова использует тот же объем, который был доступен в ОЗУ, 64 ГБ в этом случае.

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

Такое поведение потенциально значительно сокращает срок службы моих дисков (SSD). Почему Windows делает это и как это предотвратить, или как полностью отключить файл подкачки, не получая странного поведения в некоторых программах.

решение1

Во-первых, это огромная ошибка (не ваша), что диалог Windows, в котором вы устанавливаете размер файла подкачки, приравнивает файл подкачки к "виртуальной памяти". Файл подкачки - это просто резервное хранилище для одной категории виртуального адресного пространства, которое используется частной выделенной памятью. Есть виртуальное адресное пространство, которое поддерживается другими файлами (отображенными файлами), и есть vas, который всегда не выгружается и поэтому всегда остается в ОЗУ. Но это все "виртуальная память", в том смысле, что, по крайней мере, преобразование из виртуальных адресов в ОЗУ всегда работает.

Ваше наблюдение верно: распределение размера файла подкачки в Windows использует простой расчет по умолчанию = размеру ОЗУ и максимум = в два раза больше. (Раньше было 1,5x и 3x.) Им нужно установить его на что-то, и эти факторы дают результат, которого почти всегда достаточно. Это также гарантирует достаточно места в файле подкачки, чтобы поймать дамп памяти в случае сбоя системы (при условии, что вы включили дампы ядра или полные дампы).

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

Ах... он начинается с "начального размера". Это НЕ "минимально допустимый". Вот почему вы видите его в размере вашей оперативной памяти, потому что Windows использует его для начального размера.

Но... вы хотите сказать, что видите, что фактический размер файла подкачки приближается к максимальному значению? Например, если изначально он установлен на 16 ГБ, максимум на 32 ГБ, вы видите фактический размер («текущее выделенное») на уровне 32 ГБ? Кстати, он всегда должен возвращаться к первоначальному размеру при перезагрузке.

Видите ли вы всплывающие окна «Системе не хватает виртуальной памяти»? Потому что они должны появляться, когда ОС расширяет файл подкачки сверх текущего размера.

ОС не будет увеличивать файл подкачки, если только что-то не попыталось выделить так много частной выделенной памяти, что ему потребовалось увеличенное пространство файла подкачки для хранения вещей. Но, возможно, что-то и сделало это. Взгляните на вкладку «Процессы» диспетчера задач. Столбец «Размер выделения» показывает это для каждого процесса. Щелкните заголовок столбца, чтобы увидеть, кто забирает все. :)

Это крайне раздражает, поскольку отключение файла подкачки или установка его размера, не равного объему установленной оперативной памяти, приводит к проблемам в некоторых программах, использующих много памяти, например, 7zip. Они просто утверждают, что недостаточно памяти для выделения, хотя свободной доступной памяти предостаточно.

Это связано не с доступным объемом ОЗУ, а с тем, что называется "зарядом выделения" и "пределом выделения". "Лимит выделения" — это сумма (ОЗУ — невыгружаемая виртуальная память) + размер текущего файла подкачки. (Не свободная ОЗУ, а просто ОЗУ.) Таким образом, система с 8 ГБ ОЗУ и 16 ГБ текущего файла подкачки будет иметь предел выделения около 24 ГБ ("около", потому что ОЗУ, в которой хранится невыгружаемое содержимое, не учитывается в пределе выделения).

"Стоимость фиксации" — это то, сколько частного адресного пространства в настоящее время существует в системе. Это должно быть меньше лимита фиксации, в противном случае система не может гарантировать, что материалу найдется место.

На вкладке «Производительность» диспетчера задач вы можете увидеть эти два числа с надписью «Выделено (ГБ)». Например, я смотрю на машину, на которой написано «Выделено (ГБ) 1/15». Это 1 ГБ текущего выделенного трафика из лимита в 15 ГБ.

Если программа вроде 7zip попытается сделать, например, VirtualAlloc размером > (commitLimit - commitCharge), т. е. больше, чем "оставшийся" лимит коммита, то если ОС не может расширить файл подкачки, чтобы сделать лимит коммита достаточно большим, запрос на выделение не будет выполнен. Это то, что вы видите. (В Windows на самом деле нет сообщения об ошибке "недостаточно физической памяти", а не для доступа в режим пользователя! Только для виртуальной.)

Это не имеет ничего общего сбесплатноОперативная память, поскольку вся оперативная память (за исключением крошечного фрагмента, который не подлежит выгрузке) учитывается при расчете лимита фиксации, независимо от того, свободна она в данный момент или нет.

Это сбивает с толку, потому что когда вы смотрите на систему после одного из таких сбоев выделения, то, по-видимому, нет ничего неправильного — вы смотрите на систему, ваш коммит-сбор значительно ниже лимита, у вас даже может быть много свободной оперативной памяти. Вам нужно будет узнать, сколько частной выделенной памяти программа пыталась выделить, чтобы увидеть, в чем проблема. И большинство программ вам об этом не скажут.

Мне кажется, что 7zip слишком агрессивно пытается выделить vas, может быть, он масштабирует свои запросы в зависимости от размера вашей оперативной памяти? Вы уверены, что нет меньшего размера файла подкачки, при котором 7zip был бы счастлив? Вы используете 32- или 64-битную версию 7-zip? Использование 32-битной версии исправит это, так как он не может использовать больше 2 или, может быть, 3 ГБ виртуального адресного пространства. Конечно, это может быть не так быстро на огромных наборах данных.

Такое поведение потенциально значительно сокращает срок службы моих дисков (SSD).

Ну, нет, не совсем. Простое размещение файла подкачки любого размера не означает, что система действительно будет записывать так много в файл подкачки. (Если только у вас не установлена ​​опция "очистить файл подкачки при завершении работы", и даже в этом случае я не думаю, что она записывает все; Mm знает, какие блоки используются, и должна записывать только их... Я никогда раньше об этом не думал; надо будет проверить.)

Если вы хотите посмотреть, сколько всего на самом деле находится в вашем файле подкачки, используйте утилиту PerfMon. Для файла подкачки есть группа счетчиков, и вам, конечно же, нужен счетчик "% использования". Интерпретируйте этот процент в соответствии с фактическим размером файла (как показано в Проводнике).

Он ДЕЙСТВИТЕЛЬНО занимает много места, а поскольку место на SSD довольно дорогое, это беспокоит большинство из нас. Одна из вещей, которую вы можете попробовать, это поместить файл подкачки разумного размера, скажем, 4 или 8 ГБ, на ваш SSD, затем подключить вращающийся диск Rust и поместить на него большой файл подкачки. Или, если вы хотите SSD и ничего больше для вашего файла подкачки, купите дешевый маленький только для второго файла подкачки.

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