Я пытаюсь проанализировать использование памяти нашим приложением Windows Phone 7.Запрос свойства ApplicationPeakMemoryUsage
дает значение ~ 90Mb после теста на пропитку.System.GC.GetTotalMemory(true)
возвращает ~ 11Mb в это время, поэтому баланс должен быть неуправляемой памятью.Приложение не выделяет явно неуправляемую память, поэтому я предполагаю, что баланс - это ресурсы GPU, аудио и сам двоичный файл приложения.
Путем окружения вызовов ContentManager.Load()
и выделения ресурсов GPU (new RenderTarget2D()
и т. Д.),с кодом, похожим на
System.GC.Collect();
unused = System.GC.GetTotalMemory(true);
GC.WaitForPendingFinalizers();
long mem = ((long)Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage"));
.
. // perform loads/allocations
.
mem = ((long)Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage")) - mem;
Я могу получить приблизительные цифры для памяти, используемой буферами рендеринга, текстурными / аудио ресурсами и т. д. Это всего ~ 45-50Mb для моего приложения.ApplicationCurrentMemoryUsage
дает чуть меньше 10 Мб сразу в начале инициализации.Вычитая также управляемую кучу размером 11 МБ (что частично учитывает двойной счет!), Остается ~ 20 МБ неучтенной.
Профилировщик памяти Mango отслеживает итоговые значения, но только разбивает выделения для управляемой кучи.Что еще может использовать большие объемы неуправляемой памяти, кроме ресурсов графического процессора, аудио и самого двоичного файла приложения?Есть ли более разумные инструменты или методы для отслеживания памяти, чем то, что я делаю?