У меня странная проблема с памятью. У меня проблемы с разрешением, и я хотел бы получить совет относительно того, где еще искать.
У моей программы (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)
Вы можете видеть, что использование PEAK было чуть более 7 МБ, иТем не менее, вскоре после этого вы можете увидеть 2 флага, относящихся к нехватке памяти, а затем к срочному сокращению памяти, после чего приложение вскоре завершит работу.
Если я использую монитор памяти, причина сбоя кажется достаточно ясной- физическая память исчерпана - посмотрите на светло-зеленый след ниже.Предупреждения о нехватке памяти совпадают (что неудивительно) с исчерпанием физической памяти.
Также нет утечек, показывающих FWIW (я сделал это в других прогонах).
Это не кэши изображений или NSURLConache, и я могу думать только о том, что, возможно, есть некоторые плохие утечки, которые не обнаруживаются ... но у меня возникают проблемы с их идентификацией, потому что, если ящелкните по всем выделенным объектам, чтобы увидеть живые объекты, а затем выполните команду-A, чтобы выбрать их все (чтобы вставить их в электронную таблицу, чтобы увидеть, как выглядит память), в тот момент, когда я нажимаю команду -Cкопировать их, инструменты, пляжные мячи и никогда не восстанавливать.
Я действительно не могу понять, что происходит.Есть ли у кого-нибудь совет о том, как убедить инструменты показать мне более полезную информацию о том, что использует эту память?
Извините, я не могу публиковать какие-либо значимые фрагменты кода ... надеюсь, скриншоты инструментов, по крайней мере, дадут вам представление о том, откуда я.