Верно ли, что в .NET сборщик мусора вызывается, когда вы минимизируете программу?
Я создал программу на С#. Эта программа использовала около 60-70 мегабайт моей памяти.
Но когда я минимизировал эту программу, она требовала меньше памяти, то есть всего 10 Мб.
Когда я максимизировал или вернулся к этой программе, он использовал 20 MB...
Почему это происходит?
Правда ли, что сборщик мусора вызывается, когда вы минимизируете прогаму?
Ответы
Ответ 1
В этой статье объясняются все: ТАЙНА ПАМЯТИ
это выдержка из вышеуказанного сайта:
.Net Urban Legend
Можно уменьшить размер рабочего набора .Net Windows Forms приложения путем минимизации и затем максимального использования приложения сразу после его загрузки. ОС Windows урезает рабочий набор приложений, когда они минимизированы. Память, которая была кратко использована при загрузке всех тех собраний, которые были упомянуты ранее, процесс минимизации и максимизации применения. Ты можешь продемонстрируйте это поведение себе, создав и Приложение Windows Forms с помощью только Form1 и никакого добавленного кода.
-
Создайте и запустите простое приложение.
-
Откройте диспетчер задач Windows и вкладку "Процессы". Вы увидите, что диспетчер задач показывает использование памяти приложений в ок. 12,5 МБ.
-
Теперь минимизируйте свое приложение и затем максимизируйте его. Еще раз проверьте диспетчер задач. Вы увидите, что диспетчер задач теперь показывает вашу использование памяти приложений прибл. 1,5 МБ. Используемая память для загрузки сборок, когда ваше приложение было запущено, было исправлено управления памятью, когда вы минимизировали приложение.
Улучшено ли управление памятью или производительность приложения путем минимизации и максимизировать ваше приложение? Нет. Вы можете найти некоторые .Net Windows программисты, которые добавляют код для минимизации и затем максимизации своих программ думая, что они оптимизируют память. Поскольку эти программисты поделился этой техникой с другими, что-то вроде .Net Urban Legend рожденный - практика программирования, основанная на вымыслах, а не на самом деле. Эта практика не нужна, потому что когда ОС требуется оставшаяся неиспользуемая память когда сборка была загружена, она вернет ее автоматически. Фактически, уменьшение размера ваших приложений рабочий набор при большом количестве памяти может снизить производительность.
Ответ 2
Это не имеет никакого отношения к сборке мусора - это происходит и с программами, отличными от .NET(попробуйте минимизировать свой браузер, глядя на область памяти для него).
В момент, когда вы сворачиваете программу, операционной системе Windows больше не нужно поддерживать компоненты пользовательского интерфейса в памяти, поэтому требования к памяти ниже.
То есть - окна обрезают рабочий набор, когда приложение минимизировано.
Смотрите этот канал9 и этот статья в KB (спасибо @Саша Гольдштейн).
Ответ 3
Сборщик мусора запускается всякий раз, когда он решает запустить; это не обязательно связано с чем-либо, что делает пользователь, и, конечно, не сводит к минимуму приложение. Как правило, вы можете думать об этом как о размере использования памяти по сравнению с общим объемом свободной памяти. Но дело в том, что это должно быть несколько непрозрачно для вас, как программиста. Большим преимуществом сбора мусора над управлением памятью вручную является то, что вам не нужно беспокоиться об этом.
Я подозреваю, что вы используете диспетчер задач Windows, чтобы контролировать использование памяти приложения и определять, когда происходит сбор мусора. Это огромная ошибка. Если вам действительно нужно выполнить профилирование памяти, вам нужно инвестировать в правильный профилировщик. Диспетчер задач не предназначен для этого, и вы часто будете получать ложные сообщения.
Более конкретно, причина, по которой вы видите заметное уменьшение объема памяти, потребляемого вашим приложением при ее минимизации, - это всего лишь одно из ложных чтений, которые вы получите при попытке профилирования памяти с помощью диспетчера задач. Что происходит, так это то, что всякий раз, когда вы сворачиваете приложение, ядро Windows автоматически выдает большую часть используемой памяти. Вы увидите это для всех ваших приложений, а не только для тех, что написаны в .NET. Поскольку диспетчер задач показывает вам подмножество общей памяти, используемой приложением, которое существует в реальной памяти в то время (т.е. Количество, которое не было выгружено на диск), похоже, что использование памяти уменьшилось, когда на самом деле это не так. Чтобы получить более точное чтение, вы должны посмотреть на значение "Private Bytes". Эта статья статья базы знаний содержит дополнительную информацию.
Ответ 4
Вместо того, чтобы смотреть на диспетчер задач, вы должны использовать инструмент PerfMon, чтобы увидеть потребление памяти вашим приложением. Вы увидите реальную память, проверяющую этот счетчик:
Process- > VirtualBytes: Virtual Bytes - это текущий размер в байтах виртуального адресного пространства, которое использует процесс. Использование виртуального адресного пространства необязательно подразумевает соответствующее использование страниц диска или основной памяти. Виртуальное пространство конечно, и процесс может ограничить его способность загружать библиотеки.
Ответ 5
Сбор мусора в .NET происходит, когда все ваши объекты мертвы или когда вы закрываете программу. Вы также можете вызвать сборщик мусора в .NET, но он обычно не практикуется. И хотя в минимизированном режиме программа, хотя и работает (или живая или что-то еще, что вы можете вызвать), не находится в фокусе или активно используется пользователем. Таким образом, использование памяти (системные ресурсы), которое было выделено в программу, уменьшает, поэтому другие программы могут использовать системные ресурсы.
Ответ 6
Как вы определяете объем памяти, который использует ваша программа?
Я считаю, что Windows Forms известен тем, что звонил SetProcessWorkingSetSize
, чтобы вырезать как можно больше страниц из ОЗУ.