在iOS性能测试中经常会出现的一个场景是游戏制作人会问到内存到多少才不会崩溃,为了解答这个问题我们特进行此次测试。这一篇是针对IOS的测试,感谢github大神已经有现成的开源代码,这篇主要是针对测试结果的一个引申。大神可只关注测试结果。先说结果IOS内存崩溃值与机型和系统两个关键因素相关,且越新的系统内存利用率越高。
测试结果
测试机型 |
系统 |
整机内存 |
可用内存 |
崩溃内存 |
告警内存 |
IPhone SE |
9.3.3 |
2010MB |
1808MB |
1395MB |
1116MB |
IPhone 5S |
8.3 |
999MB |
812MB |
646MB |
517MB |
IPhone 6 |
8.3 |
987MB |
819MB |
647MB |
518MB |
iPhone 6P |
9.0 |
977MB |
750MB |
645MB |
516MB |
iPhone 7 |
10.3.1 |
2000MB |
1787MB |
1393MB |
1292MB |
iPhone 7P |
10.2.1 |
2998MB |
2786MB |
2042MB |
1941MB |
注:测试时,单个手机后台无其他进程运行。
测试原理
基础测试原理如下:ios内存不足会产生memory warning,会释放当前view不使用的资源,通过监控内存告警可以获取ios内存告警值;ios系统上app崩溃时可以通过调用viewDidLayoutSubviews将此时的内存写入文件;ios内核基于Darwin 内核,通过系统sysctl函数,传入HW_MEMSIZE获取整机的物理内存,等同于sysctl -a | grep hw.physmem,通过传入HW_USERMEM获取用户态内存,等同于sysctl -a | grep hw.usermem。
具体实现
ios view的生命周期如上,当view收到low memory warning时,在didReceiveMemoryWarning中将此刻的内存通过文件名称的形式备份到应用程序的私有目录下
受到low memory warning之后继续分配内存,与告警内存相似通过文件名备份到应用程序目录下,当内存不足,系统退出,那么此刻的内存就是崩溃时的内存,再次打开后读取即可。
内存利用率(告警内存/整机内存)与操作系统关系如下:
可以看到当10.x系统的内存利用率可以达到65%,8.x,9.x系统的内存利用率在50%-55%之间。
限于时间和机型有限,未比较相同机型在不同系统下内存利用率。