Предупреждения и сбои памяти iPhone - но инструменты, показывающие низкое использование памяти - PullRequest
6 голосов
/ 29 ноября 2011

У меня странная проблема с памятью. У меня проблемы с разрешением, и я хотел бы получить совет относительно того, где еще искать.

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

С тех порiOS5 вышла, у приложения были проблемы с завершением последовательности загрузки без сбоев, и до сих пор я пытался:

1) Изменил обработку JSON executeSelectorOnBackgroundThread, чтобы использовать одну NSOperationQueue, чтобы ограничить количество фонапотоки, работающие с большими объектами.

2) Добавлены NSAutoReleasePools внутри циклов, которые создают несколько больших, переходных объектов.

3) Сбрасывает sharedURLCache, чтобы файлы не зависали в системекеш.

4) Сохраняйте объекты JSON на диск с помощью NSKeyedArchiver и передавайте имена файлов между потоками, а не фактическими объектами, чтобы снова попытаться уменьшить количество и размер сохраняемых объектов, используемых в настоящее время.

Поначалу все это, казалось, имело значение, и когда я смотрю на распределение памяти, я теперь получил пиковое использование с чуть более 20 МБ (следовательно, не удивительно, что он падал) до менее 10 МБ, и все жеприложение по-прежнему падает с нехваткой памяти, как и раньше.

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

Вот типичная трассировка (на iPhone 3GS под управлением iOS 4.3.5)

enter image description here

Вы можете видеть, что использование PEAK было чуть более 7 МБ, иТем не менее, вскоре после этого вы можете увидеть 2 флага, относящихся к нехватке памяти, а затем к срочному сокращению памяти, после чего приложение вскоре завершит работу.

Если я использую монитор памяти, причина сбоя кажется достаточно ясной- физическая память исчерпана - посмотрите на светло-зеленый след ниже.Предупреждения о нехватке памяти совпадают (что неудивительно) с исчерпанием физической памяти.

enter image description here

Также нет утечек, показывающих FWIW (я сделал это в других прогонах).

Это не кэши изображений или NSURLConache, и я могу думать только о том, что, возможно, есть некоторые плохие утечки, которые не обнаруживаются ... но у меня возникают проблемы с их идентификацией, потому что, если ящелкните по всем выделенным объектам, чтобы увидеть живые объекты, а затем выполните команду-A, чтобы выбрать их все (чтобы вставить их в электронную таблицу, чтобы увидеть, как выглядит память), в тот момент, когда я нажимаю команду -Cкопировать их, инструменты, пляжные мячи и никогда не восстанавливать.

Я действительно не могу понять, что происходит.Есть ли у кого-нибудь совет о том, как убедить инструменты показать мне более полезную информацию о том, что использует эту память?

Извините, я не могу публиковать какие-либо значимые фрагменты кода ... надеюсь, скриншоты инструментов, по крайней мере, дадут вам представление о том, откуда я.

1 Ответ

6 голосов
/ 30 ноября 2011

Инструмент Leaks не очень полезен для выяснения чего-либо, кроме очевидных утечек в вашем приложении.

То, что вы описываете, является идеальным кандидатом для анализа динамической памяти. Анализ кучи позволяет вам точно увидеть, как растет куча вашего приложения между любыми двумя моментами времени (где вы определяете точки).

...