|
|
51CTO旗下网站
|
|
移动端

可清除内存

《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》第7章内存:陷阱和优化技巧,本章将围绕这个话题来进行讨论。除此之外,我们将展示一些陷阱,尤其是在Objective-C 代码中经常出现的问题。本节为大家介绍可清除内存。

作者:李俊阳 等译来源:电子工业出版社|2018-07-17 16:58

可清除内存

减轻内存压力的一种方法便是使用可清除内存,可以清除那些无法被回收的未压缩数据,也可以清除其他从更紧凑的表征方式中重新计算得来的数据。将内存标记为“可清除”,即操作系统可以在内存压力过高时,将这段内存视为待清除内存抛弃掉,而不是将其交换到磁盘中,尽管这段内存实际上是脏内存。

Apple 提供了两种方式来执行此操作,一个是底层接口,在mmap()系统调用中使用相应的标志;另一个是更高层也更方便的NSPurgeableData 类,将可清除数据用NSMutableData 的兼容接口封装起来,并实现了NSDiscardableContent 协议。

必须分别用协议的beginContentAccess 和endContentAccess 消息来锁定和解锁实际内容。数据只有在被锁定时才能够被访问,只有被解锁时才能够被清除。

discardContentIfPossible 消息可以用来清除内存,除非当前这个数据被锁定,不过当内存压力过高时,这个操作也会由系统代为执行。一旦内存被清除掉,beginContentAccess 将会返回“NO”,此外如果没有使用beginContentAccess成功锁定内存的话,那么诸如bytes 或者mutableBytes 之类的访问方法将会抛出异常。重要的一点是,不要保留指向此数据的指针,因为如果数据被清除,那么之后通过这些指针来访问该数据会导致进程被杀死退出。

关于可清除内存,还有一点要注意的是工具对可清除内存的影响。举个例子,在top工具中,当内存锁定时,它会出现在RSHRD 一栏中(而不是RPRVT 中),而当内存解锁之后就显示不出来了!可能是系统可以在任何时候将这段内存回收,但是这似乎有点误导,因为即便已清除内存已被解锁,但它仍然会导致内存压力增高。根据我的经验来看,纵观全局,系统更倾向于优先对其他内存执行分页操作,而不是优先将可清除内存段释放掉。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

计算机病毒分析与防治简明教程

本书全面翔实地介绍了各种病毒的原理,以操作系统的发展为主线,结合病毒的发展过程来综合分析病毒。在分析工具上,较多地利用了脚本语言、...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊