Диспетчер задач не показывает общее количество, которое приложение выделило из Windows. То, что он показывает (по умолчанию), является рабочим набором. Рабочий набор - это концепция, предназначенная для минимизации переполнения файла страницы в условиях ограниченной памяти. Это в основном все страницы в памяти, которые приложение постоянно затрагивает, поэтому чтобы поддерживать это приложение с достаточной отзывчивостью, ОС будет пытаться сохранить рабочий набор в физической памяти.
По вопросу о том, что пользователь не очень заботится о быстром реагировании минимизированных приложений, ОС урезает свой рабочий набор. Это означает, что при физическом давлении памяти страницы виртуальной памяти, принадлежащие этому процессу, с большей вероятностью будут выгружены на диск (в файл страницы), чтобы освободить место.
Большинство современных систем в большинстве случаев не имеют проблем подкачки в большинстве приложений. Серьезная машина для разбивания страниц может быть почти неотличима от разбитой машины, через много секунд или даже минут, прежде чем приложения ответят на ввод пользователя.
Таким образом, поведение, которое вы видите, это Windows, обрезающее рабочий набор при минимизации, а затем увеличивая его резервную копию с течением времени, когда приложение восстанавливается, затрагивает все больше и больше страниц. Это не похоже на сборку мусора.
Если вы заинтересованы в использовании памяти приложения под Windows, не самый важный номер, а целый ряд соответствующих номеров:
Виртуального размер - это общее количество адресного пространства, зарезервированного приложением. Адресное пространство (то есть, какие указатели указывают) может быть безоговорочно, зарезервировано или зафиксировано. Нефиксированная память может быть выделена в будущем, либо менеджер памяти, или при загрузке библиотеки DLL (динамические библиотеки должны пойти где-то в памяти) и т.д.
Частные рабочий набор - это страницы, которые являются частными к этому приложению (т. е. не распределяются между несколькими запущенными приложениями, так что изменения в них видны всеми) и являются частью рабочего набора (т. е. часто затрагиваются приложением).
Совместимый рабочий набор - это страницы рабочего набора, которые являются общими, но могут или не могут быть совместно использованы. Например, библиотеки DLL или пакеты (BPL) могут быть загружены в пространство памяти приложения. Код для этих DLL потенциально может быть разделен между несколькими процессами, но если DLL загружается только один раз в одно приложение, то он фактически не используется. Если DLL очень специфична для этого приложения, он функционально эквивалентен частному рабочему набору.
Общий рабочий набор - это страницы рабочего набора, которые фактически разделены. Можно было бы сопоставить «стоимость» этих страниц для любого приложения в виде общей суммы, разделенной на количество приложений, совместно использующих эту страницу.
Отдельные байты - это страницы из пространства виртуальных адресов, которые совершаются этим приложением, и которые не являются общими (или совместно используемыми) между приложениями. Практически каждое распределение памяти менеджером памяти приложения заканчивается в этом пуле. Только страницы, которые используются с определенной частотой, становятся частью рабочего набора, поэтому этот номер обычно больше, чем частный рабочий набор. Постоянно увеличивающееся количество личных байтов указывает либо на утечку памяти, либо на длительный алгоритм с большими требованиями к пространству.
Эти числа не представляют собой непересекающиеся множества. Это разные способы суммирования состояний разных типов страниц. Например, рабочий набор = частный рабочий набор + совместный рабочий набор.
Какое из этих чисел является самым важным, зависит от того, чем вы ограничены. Если вы пытались выполнять ввод-вывод с использованием файлов с отображением памяти, виртуальный размер ограничивает объем памяти, которую вы можете посвятить сопоставлению. Если вы находитесь в среде с ограниченной физической памятью, вы хотите свести к минимуму рабочий набор. Если у вас много разных экземпляров приложения одновременно, вы хотите минимизировать личные байты и максимизировать общие байты. Если вы создаете кучу разных DLL и BPL, вы хотите быть уверены, что они действительно разделены, убедившись, что их адреса загрузки не приводят к конфликту и предотвращению совместного использования.
О SetProcessWorkingSetSize:
Windows, как правило, обрабатывает рабочий набор автоматически, в зависимости от давления памяти. Рабочий набор не определяет, удастся ли вам выполнить ошибку с ошибкой (OOM). Рабочий набор, используемый для принятия решений о пейджинге, т. Е.что хранить в памяти и что оставлять на диске (в случае DLL) или выходить на диск (другая зафиксированная память). Он не будет иметь никакого эффекта, если в системе больше виртуальной памяти, чем физическая память.
Что касается его эффектов: если нижняя граница установлена на высокий уровень, это значит, что процесс будет враждебен другим приложениям и попытаться воспроизвести память в ситуациях физического давления памяти. Это одна из причин, почему для этого требуется защитное право PROCESS_SET_QUOTA.
Если верхняя граница установлена на низком уровне, это означает, что Windows не будет пытаться сохранить страницы в физической памяти для этого приложения и что Windows может вывести на экран большую часть ее на диск, когда физическое давление в памяти становится высоким ,
В большинстве случаев вы не хотите изменять детали рабочего набора. Как правило, лучше всего позволить ОС справиться с этим. Это не помешает ситуациям OOM. Обычно это вызвано исчерпанием адресного пространства, поскольку диспетчер памяти не мог зафиксировать больше памяти; или в системах с недостаточным файловым пространством страницы для резервного копирования виртуальной памяти, когда пробел в файле страницы заканчивается.
+1 для странной проблемы. Я вернусь к этому вопросу, чтобы увидеть ваше решение. – fupsduck
Обрезка рабочего набора - это красная селедка при исследовании утечки памяти, fwiw. Process Explorer может показать вам больше статистики, чем диспетчер задач (вам нужно выбрать все необходимые столбцы): http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx –
Теперь я действительно желаю, чтобы я мог принимайте несколько ответов :( –