ios内存管理浅析

Banner

昨天同学在微信朋友圈发了一张全景照片,发现部分iPhone在点击照片后会卡退。推测是因为内存不足是的程序崩溃,在这里我来从ios的内存分配分析一下。

我在微信上打开那张图片,发现系统的确会卡住,但是并没有卡退,载入后一切正常,之后我调出了我iPhone的系统日志,在众多系统日志中发现了一条消息  <Warning>: Received memory warning.

1

 

这个警告是ios系统层级上的一个警告

我们都知道iPhone从面世到现在运行内存都还没有主流安卓手机大,就连新出的iPhone 6 内存都只有1G,远远不及现在市面上安卓手机的2G,3G运行内存,但是ios依然很流畅,这不光得益于ios与安卓的相应层级不同(ios优先响应屏幕,而安卓优先响应系统内核),还得益于ios的内存分配。

125196144

iPhone等ios设备可以在内存几乎完全被使用的情况下还能流畅运行,下图是我iPhone平时的内存状态,只有27M的空闲内存,但是依然不影响使用。这是因为ios应用是Object-C语言编写而成,Object-C语言使用引用计数来管理内存,引用技术的最大优点内存释放及时、平滑,时机可控。

IMG_1885

 

iPhone下每个应用可用的内存是被限制的,如果一个应用使用的内存超过一定数目,则系统会向该应用发送Memory Warning消息。收到此消息后,应用必须正确处理,否则可能出错或者出现内存泄露。

 

后来查找了些有关Memory warning的资料,发现ios系统有四种内存警告,定义如下:

typedef enum {

        OSMemoryNotificationLevelAny      = -1,

        OSMemoryNotificationLevelNormal   =  0,

        OSMemoryNotificationLevelWarning  =  1,

        OSMemoryNotificationLevelUrgent   =  2,

        OSMemoryNotificationLevelCritical =  3

    } OSMemoryNotificationLevel;

通常出现最多的就是Memory Warning Level 1,这个时候系统会通知程序系统内存紧张,然后释放一些后台不用的程序来腾出内存空间。这时如果内存够用的话,警告就会停止,但是如内存依旧紧缺的话,系统会发出高一级别的内存警告Level 2,这时当前应用程序就会被退出,也就是有时在iPhone上出现的卡退现象。听说如果到达了Level 3,系统内核将会接管,可能会关掉ios的主界面或者重启,但是我从来没见过。

Object-C没有像JAVA一样的垃圾回收机制,也就是说,Object-C编程需要程序员手动去管理内存。这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小。

安卓系统有着GC(garbage collection)机制来管理内存,一切都是由系统来优化内存的,开发者是无法手动管理内存。

Android,Java里内存的回收是由JVM虚拟机控制的,啥时候回收由JVM决定。这样做程序员基本上不需要关心内存的泄漏和非法访问了。回收的过程就是GC,GC会暂停整个程序的运行,深入内存分配树去寻找垃圾,然后释放掉。。

所以一切都变得明了了安卓大内存手机可以在朋友圈打开超大的全景图片但有的iPhone会卡退,但是不要失望,安卓用户必须得等待那几百毫秒的垃圾回收,这也就是安卓最通常卡顿现象的原因。

打赏

Leave a Reply

Your email address will not be published. Required fields are marked *