Предупреждение о памяти, но маленькие живые байты - PullRequest
2 голосов
/ 27 мая 2010

В моем приложении я получаю предупреждение памяти уровня 1 и затем 2 после повторения какого-либо действия (выбор изображения + обработка) несколько раз, а затем происходит сбой.

Средство утечки не показывает утечки. Я также следую за инструментом Распределения в Инструментах, и мои Живые Байты составляют приблизительно 4 МБ, в целом я выделяю 113 МБ. Максимум у меня может быть 20 МБ памяти при загрузке картинки.

Так как мне приходится повторять действие, чтобы попасть в аварию, очень вероятно, что это утечка памяти. Тем не менее, я не знаю, как найти его, так как мои действительные байты составляют 4 МБ и вещи должны быть выделены (кроме небольшой утечки ~ 100 КБ в UIImagePickerController).

Насколько я могу доверять инструментам утечки / выделения памяти? Не могли бы вы посоветовать мне найти причину проблемы?

1 Ответ

2 голосов
/ 27 мая 2010

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

Например, если вам всегда требуется 4 МБ памяти для некоторой обработки, и у вас есть этот шаблон распределения:

  • Выделите 4MB
  • выделить 1КБ
  • бесплатно 4MB
  • Выделить 1КБ

(Вы не освобождаете блоки размером 1 КБ, потому что это результат вычисления или что-то еще)

Вы можете получить только 3 999 КБ свободной непрерывной памяти - поэтому в следующий раз, когда вы выделите 4 МБ, она будет расположена после пропуска, даже если она почти подходит. Это означает, что вы можете исчерпать память, даже если почти вся память (или, скорее, адресное пространство) свободна.

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

...