-2

EDIT4 Теперь у нас есть ответ. Спасибо за всех, кто участвует в тесте, особенно Джейми. Поскольку ответ был удален, вот краткое резюме: Win10 вводит сжатие памяти, что делает этот вид тестирования трудным и частично бессмысленным. Если (на Win8 x64) вы попытаетесь отключить файл подкачки и написать тестовое приложение для выделения памяти, вы, вероятно, столкнетесь с ошибкой выделения задолго до того, как ядро будет исчерпано (Out of CC). Что Джейми сделал, так это написал приложение для выполнения миллионов небольших выделений, которые действительно успешно использовали каждый последний кусок памяти без предупреждения о нехватке памяти. Таким образом, этот механизм просто больше не существует в Win 8, если вы отключите файл подкачки, первое предупреждение, которое вы получите, это сбой.

Сбой WRT при выделении памяти "нормального размера" при наличии большого количества CC, вероятно, из-за фрагментации.


С машиной Windows 8,1 x 64 с 8 ГБ или 6 ГБ вы получаете предупреждение о нехватке памяти, если объем свободной ОЗУ падает ниже примерно 20% от общего объема системной ОЗУ (1,6 ГБ и 1,2 ГБ соответственно) И в файле подкачки больше нет места. Если доступно пространство подкачки, физическая память будет выделена подкачки для сохранения 20% или ОЗУ в резерве. Так что, если вы играете в Skyrim с большим количеством модов и получаете предупреждение о нехватке памяти, вы, вероятно, увидите, что файл подкачки полностью заполнен и доступно менее 20% ОЗУ.

Кто-нибудь пробовал, что такое предел на машине с 16 ГБ Windows? Расширяется ли он без ограничений, т.е. вы получите предупреждение о недостаточном объеме памяти в 3,2 ГБ?

Самый простой способ попробовать это полностью отключить файл подкачки или установить для него низкое значение (например, 1 ГБ), а затем запустить несколько приложений с большим объемом памяти и / или просто использовать эту маленькую утилиту: http: //www.soft.tahionic. ком / скачать-memalloc /

Я бы проверил это сам, но у меня нет доступа к ПК с 16 ГБ (или больше!) баран.

В Win8.1 фактическое использование памяти немного сложнее увидеть, так как монитор производительности не показывает использование файла подкачки. Но диспетчер задач дает вам "зафиксированное" значение, которое показывает общий объем используемой памяти (включая файл подкачки)

Редактировать: Системная информация Process Explorer, вероятно, лучше всего контролировать, как используется память. Зафиксировать заряд и лимит - это актуальный бит, если у вас нет файла подкачки, Commit limit = RAM, и вы должны получить предупреждение о нехватке памяти, когда получите ~ 81% за фиксацию.

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

Вариант A Нет предела тому, насколько велика минимальная свободная память (доступная плата за фиксацию), прежде чем выдается предупреждение:

if (CC/CL) > 0.8 then print "low memory warning"

Случай B Минимальная свободная память (доступная плата за фиксацию) ограничена некоторым абсолютным значением, и перед ее пересечением предупреждение не выдается:

if (CC/CL) > 0.8 and if (CL-CC) < 2048MB then print "low memory warning"

Edit3: оказывается, Windows 10 сжимает память, когда она работает достаточно мало на реальной оперативной памяти. Это, естественно, затрудняет выполнение этого теста. Вы все еще можете исчерпать доступную оперативную память, но окна будут сжимать malloc с нулевыми значениями довольно эффективно. В Win8.1 x64 и более ранних версиях это простая задача.

Обновить

В настоящее время у меня есть несчастье, чтобы использовать 4GB Windows 7 x64 box. В этой системе Windows пытается сохранить ~ 800 МБ доступной физической памяти. Это, конечно, знакомый срез 20%. И это намного хуже, чем "резерв" на 1,6 ГБ на коробке с 8 ГБ.

Я вижу, что модератор удалил мой ответ, где я резюмировал выводы Джейми, используя специальную программу, написанную для исчерпания ядра. Спасибо за это.

2 ответа2

3

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

Предупреждение о нехватке памяти не имеет никакого отношения к свободному объему ОЗУ. У вас может быть много свободной ОЗУ, и вы все равно получите предупреждение о нехватке памяти, поскольку эта ОЗУ (косвенно) зарезервирована для обратных выделений, которые уже были сделаны, но еще не использовали ОЗУ и не могут использоваться для резервного копирования последующих выделений.

Например, предположим, что у вас есть машина Windows 8.1 x64 с 16 ГБ физической ОЗУ и без файла подкачки. Затем представьте, что вы запускаете программу, которая выделяет 15 ГБ, но еще не использует ее. Если ОС разрешает выделение, она начнет выдавать предупреждения о низком уровне виртуальной памяти (поскольку она не может разрешить выделение резервной памяти для успешного выполнения), даже если почти все 16 ГБ ОЗУ по-прежнему свободны.

Вы должны быть очень осторожны, чтобы отделить используемую оперативную память от запросов на выделение виртуальной памяти.

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

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

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

Невозможно понять, как работает память в Windows, с точки зрения простоты. Вы должны понимать разницу между распределением памяти и использованием оперативной памяти.

Тем не менее, существует некоторое пороговое значение, возможно, доля общего объема ОЗУ, которое вызывает это предупреждение. Но это не имеет ничего общего с тем, меньше ли свободной оперативной памяти, чем этот порог.

-1

Здесь есть какое-то недоразумение, которое я хотел бы прояснить, ради ОП.

Ответ Дэвида Шварца, хотя и не полный, безусловно точен, однако я хотел бы добавить к тому, что он сказал.

@OP в 2011 году мой работодатель поручил мне найти ответ на этот вопрос.
После 3-х месяцев тестирования оборудования и обширных исследований я нашел его.

Это никак не связано с размещением файла подкачки или приложения malloc/vmalloc. В основном проблема заключается в устаревшем API и некоторой неработающей реализации D3D.

Действительно короткий ответ:

Графические процессоры WDDM2.0 + D3D11.2 + 4 ГБ

Недостающее 2/4 ГБ ОЗУ зарезервировано для графического процессора. Процессор не может прикоснуться к нему, поэтому его не существует. Независимо от того, используется или нет VRAM, она восстанавливается и отображается в адресное пространство GPU.

ОЗУ, зарезервированное для графического процессора , не отображается в соответствии с системным пределом фиксации, поскольку оно недоступно для ЦП. Он также не отображается против Commit Charge, потому что он не выделен - только зарезервирован.

^^ Руссунович на самом деле говорил об этой аномилии в Winternals 7th Edition. Это просто проблема с API использования ресурсов, не более того.

Я прочитал книгу задом наперед, пытаясь выяснить, почему моя недостающая память всегда была равна количеству VRAM на GPU.

Начиная с DX11.2, WDDM 2.0 поддерживает унифицированную адресацию между ОЗУ ЦП и ОЗУ графического процессора, что означает, что графический процессор может отображать ОЗУ в собственное адресное пространство для 0 копий подкачки, мозаичных ресурсов или буферизации.

Это то место, где все идет на юг. Предполагалось, что распределение динамических ресурсов должно поддерживаться с 8.1, однако оно не было реализовано до W10. , Динамическое распределение ресурсов - это функция DX11.x, которая позволяет динамически изменять размер зарезервированной системной памяти графического процессора и возвращать ее ЦПУ во время игры. "Динамическая" часть никогда не делала этого, но резервирование системной памяти делало это.

Что происходит: 8 ГБ ОЗУ и 4 ГБ GPU, 4 ГБ ОЗУ нарезано зарезервировано

Таким образом, если у вас GPU с 4 ГБ видеопамяти на 8.1, 4 ГБ системной памяти обрезается и резервируется для графического процессора, оставляя только 4 ГБ для всей остальной системы.

Хорошо работать с отключенным Pagefile в 8.1/Dx11, просто не забудьте добавить дополнительную оперативную память в зависимости от того, сколько у вас VRAM.

Другая ирония здесь в том, что DX9 32-битный, игры не поддерживают более 4 ГБ адресного пространства, лол. Так что 4 ГБ ОЗУ зарезервировано, но игры, такие как Fallout NV, даже не могут его использовать ... так или иначе.

Мы проводим довольно небольшое тестирование платформы, где я нахожусь, эмпирическое правило, которое я нахожу работающим, - 16 ГБ ОЗУ с 4 ГБ GPU, что позволяет ~ 12 ГБ бесплатно для игр DX12, которые используют ОЗУ.

Вы могли бы пойти на W10 (тьфу), который не страдает от этих проблем ..:P

Кстати, есть также страница в библиотеке MSDN d # d, которая охватывает меня DX9 GPU

Теперь, правда, когда mm замечает, что у нее недостаточно оперативной памяти, она попытается восстановить некоторые данные: путем подкачки страниц с долго простаивающими процессами, а также страницами всех процессов, к которым недавно не обращались. Джейми Ханрахан

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

Обрезка WS - это последнее средство, признак недостаточной оперативной памяти. Память, как правило, сопоставленные / кэшированные файлы сначала очищаются из списка ожидания.

Кстати, резервный список состоит почти полностью из файлов, кэшированных с жесткого диска в оперативную память. Проверьте кэш после дефрагментации или чтения вашей музыкальной коллекции объемом 200 ГБ, также не останется свободной памяти. :)

OP, если хотите, я могу отправить некоторые скриншоты / результаты / выводы из тестирования игр и других приложений, заметок и т.д. Возможно 8-9 игр на половине платформ ...... Дай мне знать.

PS Все вышесказанное я написал по памяти, потому что все тестирование происходило 4-5 лет назад, возможно (возможно, что нет) пара незначительных замечаний, которые я высказал, может быть не на 100% дословно, как написано в цитируемых источниках.

Есть еще кое-что, что я забыл упомянуть, и это ваш вопрос «Свободная память против доступной памяти». Существует существенная разница между тем, что доступно, и тем, что бесплатно. Я расскажу об этом более подробно, когда у меня будет время. Но будьте уверены, отсутствие свободной памяти приведет к серьезному снижению производительности, если программа с интенсивным использованием памяти, такая как Skyrim, работает с модами ~ 25 ГБ. Процессы на 64-битной основе ограничены 8 ГБ для рабочего набора, однако общее адресное пространство, доступное для этого одного процесса, составляет 8 ТБ. Это называется объектом раздела, и именно так работает AWE.

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

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

Также, когда дело доходит до отключенного файла подкачки, нет виртуального адресного пространства - есть только адресное пространство. Указатели по-прежнему используются, но всегда указывают на реальные адреса памяти (в идеале, но не всегда), а предел фиксации совпадает с установленным объемом ОЗУ. :)

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