iPhone – iOS应用程序放弃了很少的驻留内存使用明显

对不起,很长的帖子…我有一个相当冗长的习惯. 😛

我的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页……约55MB?).我们的应用程序是第二大,但9.3MB的居民并不是很大.在受影响的用户使用大约15分钟后,它也会一直发生(但受影响的用户列表非常小).

从日志中可以看出,应用程序处于活动状态(手机处于锁定状态),报告时始终如此.我们确实会在被抛弃之前收到低内存警告,并在所有视图中正确实现viewDidUnload和didReceiveMemoryWarning.它似乎也释放了内存,因为9.3MB小于大约12MB的正常占用空间.而且,根据Apple的指导方针,应用程序不会更新任何视图,而且因为它只是一个好主意.:-P).我们不会在内存中保留大量内容……大多数都位于数据库中,只有在需要时才会被抓取然后释放.对于UI图像,我们可能使用的内存比任何内容都多(对于加载的视图,应该在viewDidUnload中发布).

从大量内存测试泄漏和使用VM统计和分配检查内存使用情况,我非常有信心没有内存泄漏,也没有过高的内存峰值或使用率(至少在我测试过的3G和3GS设备上).脏内存大小也不会过高(跟踪时通常大约11 MB,总共12 MB).低内存日志反映了这一点.并且,因为我是偏执狂,我甚至让用户运行内存记录受到这个讨论的启发:iPhone app uses 150 MB memory and still no low memory warning!.日志记录似乎证实了内存使用率低(应用程序驻留内存在上述放弃之前报告为9,773,056字节).虚拟大小很大(342,740,992),但是……它是虚拟的. 😛

这仅影响一小部分用户,我只看到它在3GS设备上报告(iOS 4.x ……版本各不相同,但我认为似乎已开始使用4.2).并且,在受影响的用户大约15分钟后,它始终发生.

我已经尝试让用户在报告之后使用最简单的用例,以防有一些奇怪的行为导致问题,但它仍然会发生.这让我相信这是用户手机的一些问题,但我不喜欢告诉他们没有东西可以指出这可能是问题.我无法在我的3GS或3G测试设备上重现它.

它似乎不是任何常见的罪魁祸首(高脏内存使用,内存泄漏等)所以我非常难过如何解决这个问题.有什么建议?或者至少我可以尝试进一步调查的路径? 😛

最佳答案 切换到使用LLVM3后(因为iOS 5不支持vanilla gcc),这个问题似乎已经消失了.更新中也有轻微的代码更改,LLVM3的静态分析器也发现了一些gcc或泄漏未检测到的小内存泄漏,因此我无法明确地说明问题是gcc(在iOS上)具体.但是,切换到LLVM 3似乎无论是通过更好的静态分析直接还是间接地解决了这个问题. 😛

希望这有助于其他人.

点赞