Использование памяти и минимизация - PullRequest
2 голосов
/ 25 августа 2010

У нас довольно интенсивное графическое приложение, которое использует инструментарий FOX, OpenSceneGraph и, конечно, C ++. Я замечаю, что после запуска приложения в течение некоторого времени, кажется, что есть утечка памяти. Однако, когда я минимизирую, кажется, что освобождается значительный объем памяти (как видно из диспетчера задач Windows) Когда приложение восстанавливается, использование памяти возрастает, но становится меньше, чем было до минимизации.

Является ли это огромным показателем того, что у нас неприятная утечка памяти? Или это может быть связано с тем, как Windows обрабатывает графические приложения? Я не совсем уверен, что происходит.

Ответы [ 3 ]

5 голосов
/ 25 августа 2010

То, что вы видите, это просто кеширование памяти.Когда вы вызываете free () / delete () / delete, большинство реализаций фактически не возвращает эту память в ОС.Они будут хранить его, чтобы он был возвращен гораздо быстрее, когда вы в следующий раз попросите об этом.Когда ваше приложение свернуто, оно освободит эту память, потому что вы не будете запрашивать ее в ближайшее время.

Маловероятно, что у вас есть фактическая утечка памяти.Диспетчер задач не особенно точен, и есть много поведения, которое может изменить видимый объем используемой памяти, даже если вы освободили ее должным образом.Вам нужно получить настоящий профилировщик памяти, чтобы посмотреть, если вы все еще обеспокоены.

Кроме того, да, Windows делает много вещей при минимизации приложений.Например, если вы используете Direct3D, происходит потеря устройства.Есть нити тайминги что-то.Windows предназначена для того, чтобы предоставить пользователю наилучшие возможности работы с одним приложением за один раз, и вполне может использовать для этого дополнительные кэшированные / буферизованные ресурсы.

1 голос
/ 25 августа 2010

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

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

Когда вы переключаетесь обратно на свою программу, Windows необходимо поменять страницы обратно в ОЗУ. Но это по требованию, это только страницы на страницах, которые фактически использует ваша программа. Который, как правило, будет меньше того, что использовался ранее, нет необходимости, например, менять код инициализации вашей программы.

Само собой разумеется, число не имеет абсолютно никакого отношения к использованию памяти вашей программой, это просто статистическое число.

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

Диспетчер памяти и кучи в Windows слишком сложен, чтобы делать выводы из доступных чисел. Используйте инструмент обнаружения утечек, такой как распределитель отладки VC (crtdbg.h).

1 голос
/ 25 августа 2010

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

Это может помочь вам обнаружить утечки памяти. Если минимальный объем памяти (хотя и минимизированный), используемый приложением, со временем увеличивается, это может указывать на утечку.

...