Узнать что потребляет "лишнюю" память
От: kFk  
Дата: 26.11.14 12:12
Оценка:
Никак не могу разобраться, что в приложении потребляет лишнюю память.

Из чего строю предположения о "лишней" памяти:

1) Загружаю ряд текстур, в памяти они занимают 140мб. При этом потребление памяти увеличивается на 170мб. Итого 30мб overhead.

2) Загружаю из xml множество строк, записываю их во что-то вроде std::vector<std::pair<std::string, std::string>>.
Дальше вручную считаю сколько должно занять памяти. Для вектора считаю так:
auto size = sizeof(v) + v.capacity() * sizeof(T);
for (const auto& element : v)
{
  size += TotalSizeOf(element) - sizeof(T);
}
return size;

Каждую строку считаю так:
return sizeof(s) + s.capacity() * sizeof(std::string::value_type);

Посчитанная память и выделенная почти полностью совпадают.

3) Загружаю приложение(игру) целиком. Таким же образом как и в прошлом пункте считаю потребляемую память везде, где возможно (поэлементно рекурсивно все контейнеры, раскрываю все смарт-поинтеры, память текстур, ...).
Посчитанная таким образом память — 243мб текстур + 7мб на все остальное. Реально выделенная — 350мб. Итого неизвестно куда уходят 100мб. Главная цель — понять что занимает эти злополучные 100мб.

Память мерял через:
— Windows: Private Bytes в Process Explorer от Русиновича
— Windows
PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
return pmc.PrivateUsage;

— iOS
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
return (kerr == KERN_SUCCESS) ? info.resident_size : 0; // size in bytes


Утечек нет или они минимальные, т.к. при многократной выгрузке и загрузке общая картина почти не меняется.
Ситуация под Windows и iOS аналогичная. Пробовал профилировать память в Xcode Instruments, но безрезультатно.

Помогите, а?
Заранее огромная благодарность за любые подсказки.
memory profiling visual studio xcode
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.