Операционные системы Windows и управление памятью. Что происходит, когда приложение свернуто? - PullRequest
3 голосов
/ 07 июля 2011

Я задаю этот вопрос по причинам потомства и общего интереса.Несколько лет назад я заметил странное поведение в Windows.Я знаю, что это работает в XP, и в то время это также работало в Windows 2000 и даже 98, и я предполагаю, что это поведение все еще работает для Windows 7.

Чтобы настроить мой вопрос, попробуйте этот эксперимент, выполнив следующие шаги.

  1. Откройте диспетчер задач и перейдите на вкладку «Процессы».
  2. Откройте приложение, которое, как вы знаете, потребляет достаточное количество памяти (веб-браузер должен работать нормально)и найдите этот процесс в диспетчере задач.
  3. Теперь используйте приложение, открывая окна, документы, веб-страницы и т. д. до тех пор, пока объем использования памяти вашим приложением значительно не возрастет.
  4. ЗапишитеИспользование памяти приложениями и сведение к минимуму приложения - вы должны увидеть значительное сокращение объема памяти, которое использует приложение.
  5. Наконец, восстановите приложение.

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

ВОПРОС

Внутри ОС, какой процесс происходит, что заставляетэта (предполагаемая) сборка мусора состоится?Кроме того, с помощью COM или некоторых .Net звонков есть ли способ форсировать этот процесс, не сворачивая приложение?Если да, пожалуйста, предоставьте исходный код.Язык не имеет значения.

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

Я знаю, что в .Net есть объект GC, и вы можете вызывать очистку мусора по своему желанию.Однако, похоже, что это не связано с природой очистки памяти, которая происходит, когда приложение свернуто.

Я надеюсь, что это головная уборка и что после многих лет любопытства кто-то можетдайте мне хорошее техническое объяснение того, что происходит.

Файлы страниц и дальнейшее продвижение по "кроличьей норе"

Интересные материалы были опубликованы в качестве ответана этот вопрос Краген и Алекс К. Прочитав статью в Базе знаний , которую они оба опубликовали, я вижу, что есть также способ предотвратить такое поведение.Каковы некоторые примеры того, когда вы хотели бы предотвратить освобождение этой подкачки?Я пытаюсь прочитать документацию, чтобы узнать как можно больше об этом.Большая часть этой информации является новой для меня, потому что мне никогда не требовалось реализовывать это в приложениях .Net.Рассмотрение варианта использования поможет мне понять, почему и когда я хотел бы избежать такого поведения.

Ответы [ 2 ]

7 голосов
/ 07 июля 2011

Процесс, который вы видите, это , а не сборка мусора - Windows «обрезает рабочий набор» (т. Е. Выкладывает на диск как можно больше памяти), чтобы освободить память для приложений переднего плана. 1003 *

См. Следующие ссылки для получения дополнительной информации:

В статье базы знаний, указанной выше, описывается, как можно предотвратить автоматическое выполнение этого (перехватывая команду WM_SYSCOMMAND), и как вы можете явным образом вызвать это в любое время (вызвав SetProcessWorkingSetSize).

6 голосов
/ 07 июля 2011

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

...