仪器显示没有泄漏或孤立的对象,但应用程序内存增长并在后续运行中趋于平稳

时间:2016-10-08 02:16:10

标签: swift xcode macos memory-management memory-leaks

我正在使用XCode 8.0; Swift 3.0。我正在编写一个macOS应用程序,它创建一个对象数组,其中每个对象都有一个属性,该属性是[Int]的大数组(即Int数组的数组)。数组中的每个对象都传递给一个单独的线程进行一些数学运算。这是类定义的样子:

class SearchBot {

private let BLOCKSCALE = 0.05 // Report progress for each 5%
private var head, start, end, index, size, blockSize : Int
private var doneLoading : Bool
var blocksChunked : Int
var listArray : [[Int]]

init (beginningHere b : Int, andEndingHere e : Int) {

    head = b
    start = b
    end = e
    size = end - start + 1
    listArray = Array<[Int]>(repeating: [0,0], count: size)
    index = 0
    blockSize = Int(Double(size) * BLOCKSCALE)
    blocksChunked = 0
    doneLoading = false

}

在创建SearchBots数组后,每个中的listArrays的大小约为1百万个条目,我发布了一些结果。该程序完全符合我的意图和运行后:

  • 仪器显示无泄漏
  • 仪器在程序启动时没有显示分配异常和快照一代;运行几个场景;程序完成时的快照显示现在异常的内存增长
  • XCode的记忆图显示没有孤儿,也没有泄漏

,但....

XCode的内存指示器(如下所示)表示程序从程序启动时的~20MB增加到几次运行后的~211MB。奇怪的是它只剩下~211MB。它在后续运行期间稍微达到峰值,但在完成后又回落到211MB的新“楼层”。我在Activity Monitor中观察到同样的事情,即使我将程序存档为二进制文件并从那里运行它。

XCode中的内存量表

Memory Gauge in XCode

当我将每个数组元素分配给一个单独的线程(它没有在内存图中显示)时,我不认为我在闭包中捕获self,但我尝试了[unowned self] in关闭以防万一,无论是否有结果都是相同的。

我读到某个地方,在ARC世界的OS X(macOS)的更高版本中,假设你的程序可能需要它,系统实际上将保持从应用程序释放内存(sorta cache it)后续运行。它只在内存开始受到压力时才真正释放它。

这是怎么回事?

非常感谢!

0 个答案:

没有答案