почему мое приложение только что использовало около 36 МБ памяти, но я все еще получаю предупреждение о нехватке памяти? - PullRequest
4 голосов
/ 09 августа 2010

Я использую инструменты для отслеживания использования памяти моим приложением, в мониторе памяти, я обнаружил, что реальная память меньше 36 МБ, а в большинстве случаев - всего 32 МБ, но я все равно получаю предупреждения о нехватке памяти в органайзере и вылетает.

Incident Identifier: CFEF044E-E839-4DB7-9ED6-E22CD92B9171
CrashReporter Key:   80954447762f1882da7df309d5493cf8647f4c8b
OS Version:          iPhone OS 3.2 (7B367)
Date:                2010-08-10 15:21:25 +0800

Free pages:        593
Wired pages:       18705
Purgeable pages:   1664
Largest process:   iPad4HB

Processes
         Name                 UUID                    Count resident pages
         iPad4HB <51ec4f748adb8d99e4456ba49644e516>   27182 (jettisoned) (active)
     debugserver <6f10136b8d55ad8cbd29c09a402b1f94>     149
    syslog_relay <4ceaed776d2df957fa130712f4ef21d0>      70
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      71
             lsd <a4d852c1c8da2b3d231bdc90887b52ba>     143
            apsd <f655e615956fa9881fd423d762791e7d>     197
         notifyd <5e9d5bee7c3eae1c8b494c79eb11406e>      62
        BTServer <64e4a6ea6b1240db2331e05a29caa862>     132
      CommCenter <97bf297944ac4bde19bcee96dd23bd5f>     191
     SpringBoard <c7a5904c12db7b14334a4edaa4cabaa9>    4844 (active)
      accessoryd <b4e1403f53e4c7b53b0ec833007f6589>     122
         configd <aca9fa3380322669164fd6b1a3864300>     374
   fairplayd.K48 <2d997ffca1a568f9c5400ac32d8f0782>      86
       locationd <dd1ea88105c62173908ce767db5c4d37>     654
   mDNSResponder <820560222d47a1f2a0dce98a7f8a9721>     112
    mediaserverd <ea8bac28b06fe3980fdd44b5caceb563>    5931
       lockdownd <497fd54c79a680bf29f5d9320f514613>     579
MobileStorageMou <c277b79c2157c4dc5cfc5c3ca35bd5f2>      76
         syslogd <66247e305d5c0bf6f1ce1cc950653263>      80
            ptpd <83de0f774bd6553d513ae9e19b0f9b56>     233
         launchd <66972eee4d865c4383b33d985d22994b>      72

**End**
Tue Aug 10 15:12:05 hokudaiaoniaowangruande-iPad SpringBoard[26] <Warning>: Received memory warning. Level=1
Tue Aug 10 15:12:05 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: Received memory warning. Level=1
Tue Aug 10 15:12:20 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:12:32 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:12:32 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:12:37 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:13:28 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:13:28 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:13:44 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:14:11 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:14:11 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:14:20 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:14:50 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:14:50 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:14:56 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:15:02 hokudaiaoniaowangruande-iPad mDNSResponder[19] <Error>: ERROR: mDNSPlatformReadTCP - recv: 60 (Operation timed out)
Tue Aug 10 15:16:11 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:16:11 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:17:33 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:17:44 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:17:44 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:18:01 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:18:07 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:18:07 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:18:07 hokudaiaoniaowangruande-iPad configd[24] <Notice>: jetsam: kernel memory event (90), free: 695, active: 1734, inactive: 985, purgeable: 3456, wired: 18656
Tue Aug 10 15:18:07 hokudaiaoniaowangruande-iPad SpringBoard[26] <Warning>: Received memory warning. Level=2
Tue Aug 10 15:18:07 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: Received memory warning. Level=2
Tue Aug 10 15:18:07 hokudaiaoniaowangruande-iPad SpringBoard[26] <Warning>: Memory level is urgent (10%) and there are no background apps to ask to exit.
Tue Aug 10 15:19:07 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:19:15 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:19:15 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:20:02 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:20:06 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:20:06 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:21:01 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:21:06 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playable
Tue Aug 10 15:21:06 hokudaiaoniaowangruande-iPad iPad4HB[107] <Warning>: playing
Tue Aug 10 15:21:24 hokudaiaoniaowangruande-iPad configd[24] <Notice>: jetsam: kernel termination snapshot being created
Tue Aug 10 15:21:24 hokudaiaoniaowangruande-iPad com.apple.launchd[1] (UIKitApplication:com.yourcompany.iPad4HB[0x4df4][107]) <Notice>: (UIKitApplication:com.yourcompany.iPad4HB[0x4df4]) Bug: launchd_core_logic.c:3232 (24063):0
Tue Aug 10 15:21:24 hokudaiaoniaowangruande-iPad com.apple.launchd[1] (UIKitApplication:com.yourcompany.iPad4HB[0x4df4][107]) <Notice>: (UIKitApplication:com.yourcompany.iPad4HB[0x4df4]) Bug: launchd_core_logic.c:3309 (24063):0
Tue Aug 10 15:21:24 hokudaiaoniaowangruande-iPad com.apple.debugserver-44[106] <Warning>: 1 [006a/1703]: error: ::read ( 6, 0x2809f4, 1024 ) => -1 err = Bad file descriptor (0x00000009)
Tue Aug 10 15:21:24 hokudaiaoniaowangruande-iPad com.apple.launchd[1] (UIKitApplication:com.yourcompany.iPad4HB[0x4df4][107]) <Notice>: (UIKitApplication:com.yourcompany.iPad4HB[0x4df4]) Bug: launchd_core_logic.c:2650 (24063):10
Tue Aug 10 15:21:24 hokudaiaoniaowangruande-iPad com.apple.launchd[1] (UIKitApplication:com.yourcompany.iPad4HB[0x4df4][107]) <Notice>: (UIKitApplication:com.yourcompany.iPad4HB[0x4df4]) Working around 5020256. Assuming the job crashed.

Ответы [ 6 ]

4 голосов
/ 10 августа 2010

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

Вы не публикуете код, поэтому неясно, есть ли у вас утечка памяти илипросто слишком много памятиПопробуйте использовать статический анализатор (в меню сборки XCode) и часть инструментов Leaks для проверки на утечки.Если он не найден, вам, возможно, придется оптимизировать ваше приложение, чтобы использовать меньше памяти.

Я не уверен, где вы обнаружили, что 36Mb - это нормально.На устройствах первого поколения вы получите из памяти намного больше, чем 20 МБ.Я не думаю, что какое-либо абсолютное число задокументировано, поэтому вам нужно сделать две вещи: протестировать на реальных устройствах и освободить как можно больше памяти, когда вам сообщают, что вы используете слишком много.

3 голосов
/ 10 августа 2010

Кажется, утечка памяти.Чтобы найти его, используйте не только инструмент «Утечки».«Распределение» также может помочь вам.Используйте его активно, пометьте кучи, сравните использование памяти и изучите «все еще живые» объекты (особенно объекты ваших собственных классов).

Иногда утечки памяти не могут быть автоматически обнаружены (с помощью инструмента «Утечки»).Например, представьте, что у вас есть какой-то UIImageView.Этот вид изображения должен быть создан, когда пользователь нажимает кнопку «Создать», и уничтожается, когда он нажимает кнопку «Удалить».Вы можете реализовать это поведение, как показано в коде ниже:

- (IBAction)bCreateTouchUpInside:(id)sender {
    ivSomeImageView = [[UIImageView alloc] initWithImage:iSomeImage];
    [self.view addSubview:ivSomeImageView];
    bCreate.enabled = NO;   bDestroy.enabled = YES;
}

- (IBAction)bDestroyTouchUpInside:(id)sender {
    [ivSomeImageView release];
    bCreate.enabled = YES;   bDestroy.enabled = NO;
}

И будет утечка памяти: сохраняется два раза (creation + addSubview), один раз освобождается (выпуск).Чтобы решить эту проблему, вы должны добавить [ivSomeImageView removeFromSuperview]; перед прямым выпуском сообщения.Но эта утечка не будет обнаружена инструментом «Утечки», потому что там есть правильный указатель на ваше изображение (родительский вид хранит указатели на его подпредставления).И единственный шанс обнаружить эту утечку для вас - нажать «Создать» несколько раз и увидеть, что использование памяти увеличивается с каждым разом.

2 голосов
/ 09 августа 2010

Вы пытаетесь загрузить огромное количество данных за очень короткое время? Это особенно актуально при попытке запустить последовательность анимации представления изображения. Я получил сбой, когда память была менее 20 МБ. После исследования я обнаружил, что моя последовательность изображений содержала очень большие изображения, и причиной сбоя была не полная загрузка памяти. Причиной была пропускная способность памяти.

1 голос
/ 28 января 2011

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

Попробуйте эту методику устранения неполадок ..... по-видимому, у вас может быть контроллер навигации для просмотра / вывода.

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

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

UiNavController

-Level0ViewController
        -(void)dealloc{
         // HERE TEST FOR RETAIN COUNT OF 2  (2 = one for the alloc / one for the addSubview)
         DLog(@"level0view  retain count: :%@",[level0view retainCount]);
         [level0view release]; // this will make retain count 1.
         [super dealloc];
  -- Level0View
     -(void)dealloc{
        DLog(@"dealloc"); // set break points here and confirm this is being called.
     }
   -- SomeImageView.h
      // for me my problem lied here with the infringing line below being RETAIN! it should  have been assign. changing this successfully resolved app crash and memory leak. 
      @property(retain) id delegate

P.S. Посмотрите DLog от Karl Kroft - это очень удобно, когда вы записываете номер строки класса и скрываете хафф, который обычно добавляет NSLog.

1 голос
/ 09 августа 2010

Вы получаете предупреждения памяти, когда память телефона заканчивается. «Уровень 1» предупреждений памяти вполне нормально. Если ваше приложение дает сбой, то это, вероятно, потому, что вы неправильно обрабатываете предупреждение о памяти, а не потому, что используете слишком много памяти. Есть два исправления:

  • Игнорировать предупреждение о памяти (не суперзвонить в didReceiveMemoryWarning)
  • Исправьте ваш код
1 голос
/ 09 августа 2010

Если вы используете более старую модель, такую ​​как 2g или 3g, 36 мегабайт, вероятно, больше оперативной памяти, чем вы должны играть. Я обычно начинаю получать предупреждения около 25 МБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...