Подтвердить что ты не робот

Почему я получаю предупреждения о памяти с выделенной только 7 МБ памяти?

Я запускаю приложение iOS на устройстве iPod touch и Получаю предупреждения о памяти, даже если общий пик распределения составляет всего 7 МБ, как показано ниже (это происходит, когда нажата игровая сцена):

low memory warning

Что Я нахожу странным:

  • левый пик (в момент 0.00) соответствует 20 МБ выделенной памяти (сценарий введения), и, несмотря на это, НЕ дает предупреждения о памяти.

  • Центральный пик (в момент времени 35.00) соответствует нечетному 7 МБ выделенной памяти (игровая сцена подталкивается), и она дает предупреждение о памяти.

Я не понимаю, почему я получаю эти предупреждения, если общая память составляет всего 7 МБ. Это нормально? Как я могу избежать этого?

Density peaks

Рассматривая плотность распределения, мы можем увидеть следующую схему, которая (для меня) не показывает большой разницы между моментом, когда вводится Intro Scene (0.00) и моментом, в который нажата игровая сцена ( 35,00). Являясь пиками плотности, я бы предположил, что предупреждения о памяти связаны с чем-то другим, что я не могу определить.

EDIT:

Я предпочел использовать "Монитор активности", но, к сожалению, мое приложение падает при загрузке игровой сцены с только объемом памяти 30 МБ. Вот отчет монитора активности.

Activity monitor report

Глядя на отчет, я вижу общую сумму использования реальной памяти около 105 МБ. Учитывая, что это должно относиться к ОЗУ, и если моя модель должна иметь 256 МБ, это не должно вызывать сбои APP или проблемы с утечкой памяти.

Я запускаю монитор утечки, и он не показывает никаких утечек в моем приложении. Я также убил все остальные приложения.

Однако, анализируя отчет, я вижу удивительное 167 МБ значения виртуальной памяти, связанное с моим приложением. Это нормально? Что означает это значение? Может ли это быть причиной аварии? Как я могу определить, какие области моего кода отвечают за это?

Virtual memory

Мой iPod - это модель 4-го поколения с емкостью 6,4 ГБ (память) и всего 290 МБ свободной памяти. Я не уверен, что это как-то влияет на производительность виртуальной памяти paging.

ИЗМЕНИТЬ 2: Я также посмотрел больше на SpringBoard, а его использование в виртуальной памяти - 180 МБ. Это нормально? Я нашел несколько вопросов/ответов, которые, похоже, предполагают, что SpringBoard несет ответственность за автореализацию объектов (это должен быть процесс управления экраном и домашним botton, но я не уверен, что это также связано с управлением памятью). Правильно ли это?

Еще одно примечание. Я использую ARC. Однако я не уверен, что это должно многое сделать с проблемой, поскольку нет явных утечек памяти, и XCode должен преобразовать код, добавляющий вызовы release/dealloc/keep в скомпилированный двоичный файл.

РЕДАКТИРОВАТЬ 3: Как сказано ранее, я использую ARC и Cocos2d (2.0). Я играл с монитором Activity. Я узнал, что если я удалю механизм проверки подлинности GameCenter, то Monitor Activity отлично работает (новое сомнение: у кого-то еще была аналогичная проблема? Где-то где-то где-то сохранилось представление проверки подлинности GameCenter?). Однако я заметил, что каждый раз, когда я перемещаюсь назад и вперед между различными сценами до GameScene (начальная сцена → Выбор персонажа → Выбор планеты → Выбор персонажа → Выбор планет → и т.д. → Выбор персонажа..), Использование REAL MEMORY увеличивается. Через некоторое время я начну получать предупреждения о памяти, и приложение будет убито iOS. Теперь вопрос:

- > Я правильно заменяю сцены? Я вызываю следующее из различной сцены:

[[CCDirector sharedDirector] replaceScene: [MainMenuScene scene]];

У меня Cocos2d 2.0 как статическая библиотека, а код replaceScene:

-(void) replaceScene: (CCScene*) scene
{
    NSAssert( scene != nil, @"Argument must be non-nil");

    NSUInteger index = [scenesStack_ count];

    sendCleanupToScene_ = YES;
    [scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
    nextScene_ = scene; // nextScene_ is a weak ref
}

Интересно, почему-то сцена не освобождается должным образом. Я проверил, что метод очистки вызывается, но я также добавил вызов CCLOG метода CCLayer dealloc и перестроил статическую библиотеку. В результате метод dealloc, кажется, не называется.

Это нормально?: D

Я обнаружил, что другие люди аналогичные проблемы. Мне интересно, если это связано с сохранением циклов и самостоятельных блоков.Мне действительно нужно потратить некоторое время на изучение этого, если только из EDIT 3 никто не сможет сказать мне, что я делаю неправильно: -)

4b9b3361

Ответ 1

Я решил это, добавив распечатку эффективного использования памяти в консоли. Таким образом, я мог бы получить точное измерение реальной памяти, используемой процессом App. Использование прибора оказалось неточным, поскольку используемая реальная память не соответствовала показанной на инструментах.

Этот код можно использовать для эффективного использования памяти:

-(vm_size_t)report_memory
{    
    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);
    if( kerr == KERN_SUCCESS ) {
    } else {
        NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
    }
    return info.resident_size;
}

Ответ 2

Вся емкость памяти, доступная для всех приложений и процессов, запускается в iOS. Таким образом, другие приложения могут использовать много памяти, а приложение также получает предупреждение о памяти. Вы будете получать предупреждения о памяти до тех пор, пока этого недостаточно.

Чтобы понять, что на самом деле происходит с памятью в вашем приложении, вы должны

  • Профилируйте свое приложение с помощью утечек (ARC не гарантирует, что у вас нет утечек, то есть проблема самозахвата).

  • Использовать анализ кучи (кратко описанный здесь http://bentrengrove.com/blog/2013/4/26/heapshot-analysis)

И проверьте этот пост о памяти и виртуальной памяти в iOS: http://liam.flookes.com/wp/2012/05/03/finding-ios-memory/