предупреждения и сбои памяти iPhone - но инструменты, показывающие низкое использование памяти
У меня странная проблема с памятью, у меня проблемы с решением и я был бы признателен за совет о том, где еще искать.
программа, которую я имею (iPhone App), имеет функцию, в соответствии с которой она в основном загружает файлы, обрабатывает те, которые являются JSON, и сохраняет остальные на диск. Обработка JSON является интенсивной и может занять несколько секунд на файл, поэтому у меня есть NSOperationQueue с maxConcurrency ограниченным 1, который обрабатывает всю тяжелую работу, и очередь, которая управляет несколькими файлами для загрузки.
с тех пор, как iOS5 вышел, у приложения были проблемы с завершением последовательности загрузки без сбоев, и до сих пор я пробовал;
1) изменил обработку json performSelectorOnBackgroundThread на использование одного NSOperationQueue, чтобы ограничить количество фоновых потоков, работающих с большими объектами.
2) добавлены NSAutoReleasePools внутри циклов, которые создают несколько, больших, переходных объекты.
3) сбросил sharedURLCache, чтобы убедиться, что файлы не висят в системном кэше.
4) сохранил объекты JSON на диск с помощью NSKeyedArchiver и передал имена файлов между потоками, а не фактическими объектами, чтобы снова попытаться уменьшить количество и размер сохраненных объектов, используемых в настоящее время.
все это сначала казалось важным, и когда я смотрю на распределение памяти, у меня теперь есть пиковое использование чуть более 20 МБ (следовательно, неудивительно, что это был сбой) до 10 МБ, и все же приложение по-прежнему сбой с низкой памятью, как и раньше.
Я пытаюсь проследить, что съедает память, вызывающую сбой приложения, и в этом случае у меня возникают реальные проблемы с убеждением инструментов сказать мне что-нибудь полезное.
вот типичная трассировка (на iPhone 3GS под управлением iOS 4.3.5)
вы можете видеть, что пиковое использование было чуть более 7 МБ и все же в ближайшее время после этого вы можете увидеть 2 флага, относящиеся к низкой памяти, а затем низкая память срочно, а затем приложение заканчивается вскоре после этого.
Если я использую монитор памяти, причина аварии кажется достаточно ясной - физическая память исчерпывается-посмотрите на светло-зеленый след ниже. Предупреждения о низком уровне памяти (неудивительно) совпадают с физической памятью.
нет никаких утечек, показывающих FWIW либо (я сделал это в другие маршруты).
Это не кэши изображений или кэши NSURLConnection, и единственное, о чем я могу думать, это то, что, возможно, есть некоторые плохие утечки, которые не обнаруживаются ... но у меня возникли проблемы, выявляя их, потому что если я нажимаю на все выделения, чтобы увидеть объекты, которые находятся в прямом эфире, а затем выполните команду, чтобы выделить их все (для того, чтобы вставить их в таблицу, чтобы увидеть, где память вроде бы), в тот момент я нажмите CTRL-C для копирования их документов beachballs и не восстанавливает.
Я действительно не могу понять, что происходит. Есть ли у кого-нибудь советы, как убедить инструменты показать мне более полезную информацию о том, что использует эта память?
Извините, я не могу опубликовать какие-либо значимые фрагменты кода ... надеюсь, скриншоты инструментов, по крайней мере, дадут вам представление о том, откуда я иду.
1 ответов
инструмент утечки не очень полезен для выяснения чего-либо, кроме очевидных утечек в вашем приложении.
то, что вы описываете, является идеальным кандидатом для анализа heapshot.
tl; dr анализ Heapshot позволяет точно увидеть, как куча вашего приложения растет между любыми двумя точками времени (где вы определяете точки).