2014-03-21 2 views
0

Я использую taskInfo, чтобы получить объем памяти, который использует мое приложение программно. Код, который в основномРазница в использовании памяти b/w Конфигурация отладки и освобождения

kern_return_t result = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &num); 
    if (result == KERN_SUCCESS) { 
     memoryUsed = (double)(info.resident_size/1000000.0); 

Когда я запускаю мое приложение на Debug конфигурации он сообщает гораздо больше памяти используется, по сравнению с тем, когда я запускаю его на Distribution (~ 100MB разницы). Поскольку есть некоторые другие сторонние библиотеки, которые связаны, я не уверен, что они делают некоторые странные вещи.

Мой вопрос предполагает, что мое приложение не делает ничего странного, так это нормально иметь такую ​​огромную разницу?

P.S. : Я также использую cocos2d, но я думаю, что это довольно безопасно.

+0

Я наблюдал (измерял) столько же раз.На самом деле, я усовершенствовал CCDirector, чтобы показать мне FPS и память в режиме отладки и выпуска, просто чтобы попытаться количественно оценить это. Что касается нормальности, то, с моей точки зрения, стало «нормальным» ожидать информацию о мусоре от xCode и инструментов. .02 – YvesLeBorg

+0

В вашей схеме отладки вы выбрали любой вариант, если параметры отладки памяти (например, зомби)? Это повлияет на потребление памяти. – Rob

+0

@ Rob Нет, я этого не делал, я тоже думал об этом, но я уже раздели свои схемы, чтобы не было лишних вещей. – evanescent

ответ

0

После того, как я поработал с ним еще некоторое время, я обнаружил, что никаких проблем с cocos2d или каких-либо других фреймворков нет.

Вместо этого был волосатый кусок кода, который делает что-то вроде

dispatch_async(dispatch_get_global_queue(DEFAULT, 0), ^{ 
    for(int i = 0; i < 100000; i++) { // a big loop 
     [a.b doSomethingAtIndex:i]; 
    } 
}); 

Объект a был реализован в качестве прокси-объекта и используется forwardInvocation: для разрешения вызова сообщение a.b поэтому эти вызовы были выделены, но никогда не удаляется так как он не был окружен ни одним @autorelease pool.

0

ARC чувствителен к настройкам оптимизации компилятора.

Конфигурация отладки по умолчанию приложения отключает оптимизацию (-O0). Это заставляет ARC быть педантичным (избыточным?) В retain s и autorelease s его вставками, которые, в свою очередь, могут увеличить время жизни объектов, превышающих ожидаемые.

С другой стороны, конфигурация выпуска по умолчанию включает оптимизацию (-Os). Это приводит к тому, что некоторые модели retain/release будут оптимизированы (я думаю, что это также делает менее частое использование autorelease?), Который заканчивается dealloc ранее объектом, что означает, что у вас будет меньше их висящих вокруг.

Попробуйте это: перейдите к настройкам сборки и измените «уровень оптимизации» конфигурации отладки в разделе «Генерация кода». Посмотрите, если вы все еще видите больше памяти, используемой после этого.

+1

Нет, это не проблема. Я изменил уровень оптимизации и не внес существенных изменений. Также разница в 100 МБ от ARC будет означать большое количество создаваемых объектов, чего не происходит. Выделения показывают 30 МБ использования, что предполагает, что разница более 100 МБ через объекты не правдоподобна. Это должно быть текстуры, которые я думаю, но я не могу точно определить, что. Также эта разница в памяти заключается в достижении устойчивого состояния в игре, когда никакие объекты не создаются или не разрушаются, поэтому я не думаю, что ARC может вызвать это. – evanescent

1

Я бы сказал, что это ожидаемое поведение. По крайней мере, это всегда было во всех проектах, где я сравнивал использование памяти между сборками DEBUG и RELEASE.

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

Не о чем беспокоиться. Измерить использование памяти только в сборках релизов, потому что это то, что в конечном итоге будет работать на устройствах пользователей.

+1

Существует измеримая постоянная скорость увеличения потребления памяти при работе с IDE, подключенной к текущему процессу. Однако такая же сборка при автономной работе устройства не увеличивается с течением времени. Итак, да, для поддержки задач, связанных с отладкой, требуются необходимые настройки, но также: http://stackoverflow.com/questions/19234526/constant-app-memory-increase-ioaccelresource – YvesLeBorg

Смежные вопросы