如何找出哪个课程占用的内存最多?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何找出哪个课程占用的内存最多?相关的知识,希望对你有一定的参考价值。

我对我的ios应用程序做了一个看似无害的变化,应用程序崩溃了,因为随着应用程序运行,内存消耗不断增加,直到崩溃。这可能是内存消耗增加了10倍。

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

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

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

答案

这是CIFilter initialiser中的内存泄漏。以下是重现的步骤:

  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对象并将其丢弃不会泄漏内存。

实际结果:

  • 在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上。

以上是关于如何找出哪个课程占用的内存最多?的主要内容,如果未能解决你的问题,请参考以下文章

找出哪个对象/数组使用最多的堆栈内存

Linux下如何查看哪个进程占用内存多?

如何确定 Access 数据库中哪个表使用的空间最多?

linux 查看每个应用占用内存情况

Linux下如何查看哪些进程占用的CPU内存资源最多

如何找出我的 linux 应用程序的内存占用?