iOS 使用Instruments优化内存性能

问题

项目中使用到图片合成视频,发现内存增长十分的迅速,导致一些因为内存引起的问题,本文使用这个案例,结合Instruments工具检测和分析问题,最终解决内存问题。

本文的Demo代码 ScreenRecorderTest2

Instruments检测

查看某个范围内的内存增长

  1. 打开Instruments选择Allocations工具,点击录制按钮进行录制
  2. 使用鼠标框选出内存增长的区域,图中两条黑线中的高亮区域

查看某个范围内的内存增长
  • 上面图表区域是内存的可视化视图
  • 下面的面板区域显示的是具体的统计数据
    可以看到整体的内存增长为16.81M (All Heap Allocations 堆内存的分配)

堆内存分配的详细统计数据
点击All Heap Allocations旁边的小箭头按钮可以看堆内存分配的详细统计数据: 

堆内存分配的详细统计数据
  • Address:数据的内存地址
  • Timestamp:数据创建的时间
  • Size:数据的大小
  • Responsible Library:数据创建的相关的库
  • Responsible Caller:数据创建的相关的库的函数调用

统计数据表中可以看出AppleJPEG 库调用 applejpeg_decode_create 方法创建了很多的内存的数据

右边区域显示的是函数的调用栈信息面板(Stack Trace),右上角的工字型按钮可以切换显示系统函数调用

切换显示系统函数调用

内存分配大小与对应的代码调用信息的可视化显示
点击调用栈中的高亮代码可以查看代码详情和内存信息:

内存分配大小与对应的代码调用信息的可视化显示

右边的标注区域显示的是内存占用的比例。

分析

上图中看到buffer对象和image占用的内存最大,但是buffer在每次使用之后都会调用CVPixelBufferRelease释放对应的内存,不会有内存的问题,image对象释放的不及时,会在整个while循环块中保留一段时间,导致内存的增长。
此外image对象释放不及时和在在同一时间调用CVPixelBufferRelease(buffer);释放buffer也有关系,如果没有创建buffer和释放buffer的操作,image对象的增长也不会很明显,释放的速度也挺快,下面两个对照组可以进行对比分析

对照组1:只有在循环中创建image对象内存增长:
内存增长为2.73M

对照组1:只有在循环中创建image对象内存增长:

对照组2:在循环中添加autoreleasepool创建image对象内存增长:
内存增长为492K

对照组2:在循环中添加autoreleasepool创建image对象内存增长

由上可知,使用autoreleasepool可以有效的解决在某个循环中创建大量的内存敏感型对象导致的内存上涨的问题

最终解决方案
在while循环内部使用autoreleasepool块,每次循环arc对象得以及时的释放,内存增长从原来的16.81M下降到了只有475K

最终解决方案

代码:

while(i < imageNames.count) {// 添加自动释放池,让内存敏感型的对象(UIImage)及时释放@autoreleasepool {// 代码省略...NSString *imageName = [imageNames objectAtIndex:i];NSString* imagePath = [imageSavedDir stringByAppendingPathComponent:imageName];UIImage* image = [UIImage imageWithContentsOfFile:imagePath];if(adaptor.assetWriterInput.readyForMoreMediaData) {i++;CMTime frameTime = CMTimeMake(1, fps);CMTime lastTime = CMTimeMake(i, fps);CMTime presentTime = CMTimeAdd(lastTime, frameTime);buffer = [self pixelBufferFromCGImage:[image CGImage] size:videoFrameSize];// 写入视频BOOL result = [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];if(buffer) {CVPixelBufferRelease(buffer);}// 代码省略...[NSThread sleepForTimeInterval:0.05];} else {NSLog(@"Error: Adaptor is not ready");[NSThread sleepForTimeInterval:0.05];i--;}}
}
复制代码

总结

以上是使用Instruments解决内存问题的总结,如有不妥之处还请不吝赐教
本文的Demo代码 ScreenRecorderTest2

转载于:https://juejin.im/post/5ca5d483f265da3097287049

iOS 使用Instruments优化内存性能相关推荐

  1. 十条服务器端优化Web性能的技巧

    服务器  远程桌面连接工具 提高web应用的性能从来没有比现在更重要过.网络经济的比重一直在增长;全球经济超过5%的价值是在因特网上产生的(数据参见下面的资料).这个时刻在线的超连接世界意味着用户对其 ...

  2. iOS性能优化-内存优化

    https://blog.csdn.net/a184251289/article/details/82589128 2018年09月10日 14:25:31 xingshao1990 阅读数:328 ...

  3. UE 手游在 iOS 平台运行时内存占用太高?试试这样着手优化

    性能优化,对游戏开发来说是一个需要不断钻研的课题,性能越好,游戏才会运行的更加顺畅,玩家的体验感才会更好.腾讯游戏学院专家.游戏客户端开发 Leonn,将和大家分享 UE 手游在 iOS 平台上的内存 ...

  4. iOS视图成像理论及性能优化

    iOS不是一蹴而就的,其中参杂了无数先驱的心血与智慧.在我们享受着iPhone的便捷时,其实我们忽略了很多细节,视图成像就是这样.每天我们都会不自然的打开手机,点击应用,处理信息,获取快乐,但是我们所 ...

  5. Android 性能监测工具,优化内存、卡顿、耗电、APK的方法

    导语     安卓大军浩浩荡荡,发展已近十个年头,技术优化月新日异,如今 Android 9.0 代号P  都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得 ...

  6. Unity性能优化 - 内存

    检查图片设置 纹理优化一般是检测上述五个区域 Read/Write Enabled:开启Read/Write Enable属性,将允许从脚本(GetPixels,SetPixels和其他Texture ...

  7. 转:AIX 5L 内存性能优化

    引言 内存子系统中最重要的优化部分并不涉及到实际的优化工作.在对您的系统进行优化之前,必须弄清楚主机系统的实际运行情况.要做到这一点,AIX® 管理员必须知道应该使用何种工具,以及如何对他或她将要捕获 ...

  8. Android性能优化 - 内存优化

    性能优化系列阅读 Android性能优化 性能优化 - 消除卡顿 性能优化- 内存优化 性能分析工具 - TraceView Android性能分析工具 为什么内存优化? 在一个商业项目中,很有可能因 ...

  9. 经典|图解Linux内存性能优化核心思想

    hi,大家好,今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种 ...

最新文章

  1. UVa483 Word Scramble
  2. mysql数据库有几种删除方式_sql有几种删除表数据的方式
  3. JS获取URL中GET的参数
  4. 26 行 ABAP 代码使用 HTTP_GET 函数下载百度网站的首页数据
  5. Spring AOP两种使用方式以及如何使用解析
  6. 泡泡玛特通过港交所聆讯 上半年总收益8.18亿元
  7. 连接池dbcp跟c3p0
  8. Ubuntu16.04下配置laravel
  9. ios7中使用scrollview来横向滑动图片,自动产生偏移竖向的偏移 问题
  10. 保险未起保是投保成功了吗?
  11. 撤销本地的commit
  12. ArcGIS制图表达Representation实战篇4-自由式制图表达
  13. KingDZ 变菜鸟,每日一个C#小实例之---玩转鼠标
  14. 当identity_insert 设置为off时不能为表_最近新get日志测试方法,再也不用为故障响应慢发愁!...
  15. 【排序】排序算法之分配排序
  16. 十个经典java开发项目及其描述-马上写到你的简历中去吧,祝你升职加薪
  17. jsp项目如何定位当前页面是哪个jsp
  18. 雪花漂浮php,h5canvas实现雪花飘落的特效代码
  19. java获取融云token、并实现群组聊天、管理等后台接口示例
  20. 通知提示音修改默认铃声

热门文章

  1. 得出来的视差图左边有黑色补上原图_「PS教程」Photoshop使用通道快速抠图的详细教程...
  2. 脑电分析系列[MNE-Python-2]| MNE中数据结构Raw及其用法简介(更新)
  3. 脑机接口EEG信号分类算法
  4. Go web之旅(路由篇)
  5. [unreal4入门系列之九] UE4创建空白关卡并添加碰撞体
  6. 前NASA工程师硬核“复仇”,自制闪光臭屁炸弹,把快递小偷都整不会了
  7. 那么多短视频特效,凭什么抖音出的这么火
  8. 万维网源代码正在被发明人拍卖,有人出价1800万,还在不断上涨
  9. 不吹牛,中国车主已经实现了「停车自由」
  10. 无惧隐私泄露,企业修炼“看不见的数据圣手”