使用Apple Instruments进行高内存分配调试

时间:2019-07-01 10:57:18

标签: swift memory-management memory-leaks instruments

我有一个快速编写的应用程序,最初运行良好,但随着时间的流逝,该应用程序会变得缓慢。我已经使用“分配和泄漏”配置文件打开了一个工具分析会话。

我发现分配大大增加,所做的事情只会覆盖当前数据。

enter image description here

有问题的内存在<非对象>

组中

enter image description here

打开该组将提供数百种不同的分配,所有负责的库都是libvDSP。因此,我可以得出结论,这是vDSP调用无法正确释放内存。但是,双击其中的任何一个都不会给我显示任何代码,但是我看不懂原始语言。

enter image description here

调用vDSP的函数包装如下:

func outOfPlaceComplexFourierTransform(
    setup: FFTSetup,
    resultSize:Int,
    logSize: UInt,
    direction: FourierTransformDirection) -> ComplexFloatArray {

    let result = ComplexFloatArray.zeros(count:resultSize)

    self.useAsDSPSplitComplex { selfPointer in
        result.useAsDSPSplitComplex { resultPointer in
            vDSP_fft_zop(
            setup,
            &selfPointer,
            ComplexFloatArray.strideSize,
            &resultPointer,
            ComplexFloatArray.strideSize,
            logSize,
            direction.rawValue)
        }
    }
    return result
}

这是从另一个函数调用的:

var mags1 = ComplexFloatArray.zeros(count: measurement.windowedImpulse!.count)
    mags1 = (measurement.windowedImpulse?.outOfPlaceComplexFourierTransform(setup: fftSetup, resultSize: mags1.count, logSize: UInt(logSize), direction: ComplexFloatArray.FourierTransformDirection(rawValue: 1)!))!

在此函数中,对mags1进行操作并覆盖现有数组。我的理解是,此功能完成后,就会将mags1释放,因为它仅在该功能内部可用。

此函数有时每秒被多次调用。任何帮助将不胜感激,因为它只需要5mb,就可以在几秒钟内迅速增长200兆字节。

任何进一步调查泄漏源或一旦完成就适当地重新分配此内存的指针,将不胜感激。

2 个答案:

答案 0 :(得分:0)

检查您是否正在使用

lazy

还要确保您的代表像这样的班级和弱类型 protocol Delegate: class{} weak var delegate: Delegate? 我在项目中遇到了同样的问题,并且在上面已经消除了那些问题。

答案 1 :(得分:0)

我不敢相信在发布此信息后我能这么快解决这个问题。 (我真的有几个小时拉了我的头发)。

此处未包含在我的代码中,每次调用时我都在创建一个新的FFTSetup。显然,这是占用大量内存的,并且没有重用此内存。

在查看调用树的仪器中,我能够看到利用此内存的功能。

enter image description here