对不起,很长的帖子…我有一个相当冗长的习惯. 😛
我的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似乎无论是通过更好的静态分析直接还是间接地解决了这个问题. 😛
希望这有助于其他人.