如何找出哪个课程占用的内存最多?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何找出哪个课程占用的内存最多?相关的知识,希望对你有一定的参考价值。
我对我的ios应用程序做了一个看似无害的变化,应用程序崩溃了,因为随着应用程序运行,内存消耗不断增加,直到崩溃。这可能是内存消耗增加了10倍。
我如何找出哪个类或结构对此负责?我正在寻找类似的东西:
CVPixelBuffer:800MB CMSampleBuffer:100MB CIImage:50MB
我查看了Xcode的内存调试器和Instruments,但一无所获。
答案
这是CIFilter initialiser中的内存泄漏。以下是重现的步骤:
- 使用AVFoundation捕获原始样本缓冲区。
- 调用CMSampleBufferGetImageBuffer()来获取CVPixelBuffer:
- 创建一个CIFilter:
- 请注意,CIFilter被丢弃了。
- 完成上述所有步骤后,返回步骤1,重复100次。
这是代码:
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
let metadata = CMCopyDictionaryOfAttachments(nil, sampleBuffer, kCMAttachmentMode_ShouldPropagate)!
_ = CIFilter(cvPixelBuffer: pixelBuffer, properties: metadata)
预期成绩:
创建Swift对象并将其丢弃不会泄漏内存。
实际结果:
- 在iOS杀死应用程序之前,内存使用量以无限制的方式增长到超过1 GB。
- 注释掉创建CIFilter的行消除了这个问题。
- 使用dngPhotoDataRepresentation()将RAW示例缓冲区转换为NSData并将其传递给CIFilter初始化程序可以消除此问题,但似乎更慢。
- CVPixelBuffer似乎没有发布,因为CIFilter(或iOS内部的一些其他代码正在泄漏)。我通过创建一个对CVPixelBuffer的弱引用来验证。如果缓冲区被释放,弱引用应该变为零,但它不会。
- 捕获BGRA(而不是RAW)样本缓冲区并将其转换为CIImage不会泄漏内存: _ = CIImage(cvImageBuffer:pixelBuffer,options:[kCIImageProperties:metadata])
这是在iPhone 7 Plus和iPhone X上的iOS 11上。
以上是关于如何找出哪个课程占用的内存最多?的主要内容,如果未能解决你的问题,请参考以下文章