繁体   English   中英

如何找出哪个类别占用最多的内存?

[英]How do I find out which class is taking the most memory?

我对iOS应用程序进行了看似无害的更改,但该应用程序崩溃了,因为随着应用程序的运行,内存消耗一直在不断增加,直到崩溃为止。 这可能是内存消耗增加了10倍。

我如何找出哪个类或结构对此负责? 我正在寻找类似的东西:

CVPixelBuffer:800MB CMSampleBuffer:100MB CIImage:50MB

我查看了Xcode的内存调试器和Instruments,但一无所获。

这是CIFilter 初始化程序中的内存泄漏。 以下是重现步骤:

  1. 使用AVFoundation捕获原始样本缓冲区。
  2. 调用CMSampleBufferGetImageBuffer()获取CVPixelBuffer:
  3. 创建一个CIFilter:
  4. 请注意,CIFilter已被丢弃。
  5. 完成上述所有步骤后,返回步骤1,并重复100次。

这是代码:

let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
let metadata = CMCopyDictionaryOfAttachments(nil, sampleBuffer, kCMAttachmentMode_ShouldPropagate)!
_ = CIFilter(cvPixelBuffer: pixelBuffer, properties: metadata)

预期成绩:

创建一个Swift对象并扔掉它不会泄漏内存。

实际结果:

  • 内存使用量无限制地增长到超过1 GB,直到iOS终止了该应用程序。
  • 注释掉创建CIFilter的行可以消除此问题。
  • 使用dngPhotoDataRepresentation()将RAW样本缓冲区转换为NSData并将其传递给CIFilter初始化程序可以消除此问题,但速度较慢。
  • CVPixelBuffer似乎没有发布,因为CIFilter(或iOS内部的一些其他代码正在泄漏)。 我通过创建对CVPixelBuffer的弱引用进行验证。 如果释放了缓冲区,则弱引用应为nil,但不会。
  • 捕获BGRA(而不是RAW)样本缓冲区并将其转换为CIImage不会泄漏内存:

    _ = CIImage(cvImageBuffer:pixelBuffer,选项:[kCIImageProperties:元数据])

这是在iPhone 7 Plus和iPhone X上的iOS 11上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM