Приложение для iOS выброшено с небольшим использованием резидентной памяти - PullRequest
4 голосов
/ 07 октября 2011

Извините за длинный пост ... У меня есть привычка быть довольно многословным.: -P

У меня странная проблема с моим приложением для iOS, о которой пользователи сообщают уже несколько месяцев.Я изучал это несколько раз, но продолжаю сталкиваться с препятствиями.Приложение отброшено, но, по-видимому, не использует слишком много памяти в то время, когда оно выбрасывается.Например, вот один журнал пользователя (имя приложения и идентификаторы изменены):

Incident Identifier: OMIT
CrashReporter Key:   OMIT
Hardware Model:      iPhone2,1
OS Version:          iPhone OS 4.3.5 (8L1)
Kernel Version:      Darwin Kernel Version 11.0.0: Sat Jul  9 00:54:20 PDT 2011; root:xnu-1735.47~1/RELEASE_ARM_S5L8920X
Date:                2011-10-01 09:50:03 +0100
Time since snapshot: 41 ms

Free pages:        710
Wired pages:       10076
Purgeable pages:   416
Largest process:   SpringBoard

Processes
         Name                 UUID                    Count resident pages
          MY_APP <f01c118296fe329899981e37e00c6cc3>    2258 (jettisoned) (active)
MobileMusicPlaye <c26fcc882cf130f09979f9ca08521fce>    1024 (jettisoned)
     MobilePhone <d3042adf269630daa58e43d0ba5eeb54>     649 (jettisoned)
      MobileMail <573ff3a3e09334c7aa51d8568c845e11>     716 (jettisoned)
             lsd <3fafa485b73836acb973d50feabd963a>     148
         notifyd <9966082842de313a8e05a001c783faf4>     117
        BTServer <01550e9527353eecae41ebee0f889603>     182
      CommCenter <7d9446365b4836968ae361626ef8f939>     440
     SpringBoard <5c55c6fba0843b0e924e116413b8c9d4>    3305 (active)
      accessoryd <d30e340e36df356bbde3347a6ed1ef87>     160 (jettisoned)
            apsd <47ffc9ce9f84371588bd3f937aaa20bb>     278
         configd <a6d457fca42732d9ba809d03a2b3e3ae>     427
   fairplayd.N88 <46c1d3fbe93a370089f783f96a5cf531>     177
       locationd <9088e845dcbe37d890c8758655bf34c6>    1065
   mDNSResponder <caf94711b8093dc5bc5736306f8ae818>     200
    mediaremoted <21af791e80823c9f90f0be2b77a3d885>     251
    mediaserverd <c731263114c33a07aef7bccdcf667271>    1512
       lockdownd <1c7f2b41744c35dc92f679e90a73e240>     278
         syslogd <d81669e7bdb93f9b9012020beac826f4>      99
usbethernetshari <25130d2f9a0334e3ae28780250343144>     110
         launchd <e2d41e07a0743a089eadbae765709c82>      88

**End**

Это устройство 3GS, и из того, что я видел в журналах LowMemory, там не так много работы (13484 страницы).... около 55 МБ?)Наше приложение является вторым по величине, но на 9,3 МБ резидент вряд ли огромен.Это также постоянно происходит после примерно 15 минут использования для затронутых пользователей (но список затронутых пользователей довольно мал).

Как видно из журнала, приложение было активным (телефон был заблокирован сверху), так какэто всегда тот случай, когда сообщается.Мы получаем предупреждения о нехватке памяти до того, как были отброшены, и должным образом реализуем viewDidUnload и didReceiveMemoryWarning во всех представлениях.Похоже, он тоже освобождает память, так как 9,3 МБ меньше, чем обычно, около 12 МБ.Кроме того, приложение не обновляет представления, пока оно заблокировано в соответствии с рекомендациями Apple (и потому, что это просто хорошая идея. :-P).Мы не храним много вещей в памяти ... большинство находится в БД и захватывается только тогда, когда это необходимо, а затем освобождается.Вероятно, мы используем больше памяти для образов пользовательского интерфейса, чем что-либо еще (что должно быть выпущено в viewDidUnload для загруженных представлений).

Из обширного тестирования памяти с утечками и проверки использования памяти с помощью статистики и распределения виртуальных машин, я вполне уверен, что тамнет утечек памяти, чрезмерных скачков или использования памяти (по крайней мере, на устройствах 3G и 3GS, на которых я тестировал).Размер грязной памяти также не кажется чрезмерно высоким (обычно около 11 МБ при отслеживании и всего 12 МБ резидентного объема).Журнал низкой памяти отражает это.И, поскольку я параноик, у меня даже пользователи запускались с регистрацией памяти, вдохновленной этим обсуждением: Приложение iPhone использует 150 МБ памяти и все еще не выдает предупреждение о нехватке памяти! .Регистрация, кажется, подтверждает низкое использование памяти (резидентная память приложения была зарегистрирована как 9 773 056 байт непосредственно перед вышеприведенным сбросом).Виртуальный размер большой (342 740 992), но ... он виртуальный.: -P

Это влияет только на небольшое подмножество пользователей, и я только когда-либо видел, что об этом сообщалось на устройствах 3GS (версия iOS 4.x ... меняется, но, кажется, началась с 4.2, я думаю),И это последовательно происходит примерно через 15 минут для затронутых пользователей.

Я пытался заставить пользователя использовать приложение в простейшем случае, после того, как о нем сообщили в случае странного поведения, которое вызывает проблему, но этовсе еще происходит.Это заставляет меня поверить, что это проблема с телефонами пользователей, но я не люблю говорить им, что без чего-либо, что могло бы указать на это, может быть проблема.Я не могу воспроизвести его на своих тестовых устройствах 3GS или 3G.

Кажется, это не обычные виновники (высокое использование грязной памяти, утечки памяти и т. Д.), Поэтому я в значительной степени озадачено том, как решить этот.Какие-либо предложения?Или, по крайней мере, путь, который я могу выбрать, чтобы попытаться продолжить расследование?: -Р

Ответы [ 2 ]

2 голосов
/ 04 января 2012

После перехода на использование LLVM3 (поскольку vanilla gcc не поддерживается в iOS 5), эта проблема, похоже, исчезла.Также были небольшие изменения в коде с обновлением, и статический анализатор LLVM3 также обнаружил пару небольших утечек памяти, которые не были обнаружены ни gcc, ни утечками, поэтому я не могу однозначно сказать, что проблема была специфичной для gcc (на iOS).Но переключение на LLVM 3, казалось, решило проблему, прямо или косвенно, посредством лучшего статического анализа.: -P

Надеюсь, это поможет кому-то еще.

0 голосов
/ 10 ноября 2011

В общем, какие оптимизации вы используете?Что-то, что влияет на математическую точность, может иметь значение, скажем, быстрая математика или что-то в этом роде.Это может повлиять на память, если, скажем, у вас есть плавающее место где-то в памяти malloc.

Как я уже сказал, длинный выстрел ...

...