Правда ли, что в .NET сборщик мусора вызывается при сворачивании программы? - PullRequest
15 голосов
/ 01 февраля 2011

Я создал программу на C #.Эта программа использовала около 60-70 МБ памяти.Но когда я свернул эту программу, ей потребовалось меньше памяти, то есть всего 10 МБ.

Когда я развернул или вернулся к этой программе, она использовала 20 МБ ...

Почему этослучилось?

Правда ли, что сборщик мусора вызывается, когда вы минимизируете программу?

Ответы [ 6 ]

23 голосов
/ 01 февраля 2011

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

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

То есть - Windows обрезает рабочий набор, когда приложение свернуто.

См. эту ветку channel9 и эту KB статью (спасибо @ Саша Гольдштейн ).

8 голосов
/ 01 февраля 2011

Сборщик мусора запускается всякий раз, когда решает запустить; это не обязательно связано с тем, что делает пользователь, и, конечно, не сворачивает приложение. Как правило, вы можете рассматривать это как функцию от объема используемой памяти по сравнению с общим объемом свободной памяти. Но дело в том, что для программиста это должно быть несколько непрозрачно. Большим преимуществом сборки мусора по сравнению с ручным управлением памятью является то, что вам не нужно беспокоиться об этом.

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

В частности, причина, по которой вы, по-видимому, видите заметное уменьшение объема памяти, используемой вашим приложением, когда вы минимизируете его, является лишь одной из ложных операций чтения, которые вы получите при попытке выполнить профилирование памяти с помощью диспетчера задач. На самом деле происходит то, что всякий раз, когда вы минимизируете приложение, ядро ​​Windows автоматически выгружает большую часть используемой памяти. Вы увидите это для всех ваших приложений, а не только для тех, которые написаны на .NET. Поскольку диспетчер задач показывает вам подмножество общей памяти, используемой приложением, которое существует в реальной памяти в данный момент (т. Е. Объем, который не был выгружен на диск), он выглядит следующим образом использование памяти уменьшилось, когда это не так. Чтобы получить немного более точное чтение, вы должны посмотреть на значение «Private Bytes» процесса. Эта статья базы знаний предоставляет дополнительную информацию.

3 голосов
/ 12 марта 2012

Эта статья объясняет все: ТАЙНА ПАМЯТИ

это выдержка из вышеупомянутого сайта:

.Net Urban Legend

Можно уменьшить размер рабочего набора приложения .Net Windows Forms, свернув и развернув приложение сразу после его загрузки.ОС Windows обрезает рабочий набор приложений, когда они свернуты.Память, которая кратко использовалась при загрузке всех упомянутых ранее сборок, обрезается в процессе минимизации и максимизации приложения.Вы можете продемонстрировать это поведение, создав и запустив приложение Windows Forms только с Form1 и без добавления кода.

  1. Создайте и запустите простое приложение.

  2. Откройте диспетчер задач Windows, а затем вкладку «Процессы».Вы увидите, что диспетчер задач показывает использование памяти вашим приложением в ок.12,5 МБ.

  3. Теперь сверните приложение, а затем разверните его.Проверьте диспетчер задач еще раз.Вы увидите, что диспетчер задач теперь показывает использование памяти вашим приложением на ок.1,5 МБ.Память, которая использовалась для загрузки сборок при запуске вашего приложения, была освобождена управлением памятью, когда вы свернули приложение.

Улучшали ли вы управление памятью или производительность приложений, минимизируя и максимизируя ваше приложение?Нет. Вы можете найти некоторых программистов .Net Windows, которые добавляют код для минимизации, а затем максимизируют свои программы, думая, что они оптимизируют память.Поскольку эти программисты поделились этой техникой с другими, родилась своего рода .Net Urban Legend - практика программирования, основанная на вымысле, а не на фактах.Эта практика не нужна, поскольку, когда ОС требуется неиспользуемая память, оставленная после загрузки сборок, она автоматически восстанавливает ее.На самом деле, уменьшение размера рабочего набора вашего приложения при большом объеме памяти может снизить производительность.

1 голос
/ 01 февраля 2011

Вместо просмотра диспетчера задач вы должны использовать инструмент PerfMon, чтобы увидеть потребление памяти вашим приложением.Вы увидите реальную память, проверяющую этот счетчик:

Process-> VirtualBytes: Virtual Bytes - это текущий размер в байтах виртуального адресного пространства, которое использует процесс.Использование виртуального адресного пространства не обязательно подразумевает соответствующее использование страниц диска или основной памяти.Виртуальное пространство конечно, и процесс может ограничивать его способность загружать библиотеки.

0 голосов
/ 01 февраля 2011

Сборка мусора в .NET происходит, когда все ваши объекты мертвы или когда вы закрываете программу.Вы также можете вызвать сборщик мусора в .NET, но это обычно не практикуется.И хотя программа находится в свернутом режиме, хотя она работает (или работает, или как вы можете позвонить), она не находится в фокусе или активно используется пользователем.Таким образом, использование памяти (системных ресурсов), выделенной программе, сокращается, поэтому другие программы могут использовать системные ресурсы.

0 голосов
/ 01 февраля 2011

Как вы определяете объем памяти, используемый вашей программой?

Я полагаю, что Windows Forms известна вызовом SetProcessWorkingSetSize для удаления как можно большего количества страниц из ОЗУ.

...