NSURLSession - 高内存使用率

时间:2015-10-31 06:52:35

标签: ios swift macos memory nsurlsession

在我的应用程序(OS X应用程序)中,我在短时间内发送大约5,000个URL请求,以从服务器检索JSON对象。我同时发送50个请求,等待所有请求完成,然后发送另一批50个。但是我有一些内存管理问题...

当所有请求都已完成(约2分钟)时,我的应用程序将其内存使用量增加了大约250MB,并且此内存永远不会被释放。我使用NSURLSession/dataTaskWithURL来获取数据,并且为了排除故障,我已从完成处理程序中删除了所有代码 - 它只是触发请求并丢弃响应。这是一个例子:

func fetchData() {
    let config = NSURLSessionConfiguration.ephemeralSessionConfiguration()
    // Also tried .defaultSessionConfiguration()
    config.URLCache = nil
    config.HTTPCookieAcceptPolicy = .Never
    config.HTTPCookieStorage = nil
    let session = NSURLSession(configuration: config)

    let query = session.dataTaskWithURL(myURL) { (data, response, error) -> Void in
        session.invalidateAndCancel()
        // Normally call a completion handler here too
    }
    query.resume()
}

请注意,我禁用所有缓存和Cookie,以及在请求完成时调用invalidateAndCancel()。我也尝试过使用标准sharedSession(),但这些都没有任何区别 - 内存使用量总是快速攀升并永久保持高位。

这是一个很大的问题,因为我的应用程序需要定期发送这些请求,并且每个周期内存只会越来越高 - 最终达到几GB的RAM。还应该注意的是,一旦内存使用达到这一点,我的程序就会慢慢爬行。

有人知道为什么NSURLSession可能会保留这么多记忆吗?使用Instruments进行分析并不会发现任何内存泄漏,所以我在这里很难过。任何帮助或建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

两件事:

  1. 由于您正在使用NSURLSession,因此请确保您没有为这5000个请求中的每一个实例化一个新的请求。实例化一个,然后重用它。也许尝试使用NSURLSession.sharedSession()代替。

    我已经看到每个会话的内存消耗适度,如果你有非常多的会话,它可以加起来

  2. 你说你运行仪器寻找泄漏。如今,你很少发现像这样令人震惊的东西。但是你也应该寻找强大的参考周期等,比如通过分析两个时间点之间的分配或代数,并确定对于250mb的帐户,然后查看它分配的位置等。

    查看WWDC视频,例如2013年Fixing Memory Issues或2012年iOS App Performance: Memory(并忽略了iOS在标题中的事实;因为其中许多原则同样适用在MacOS上),它将说明如何诊断此类问题。

答案 1 :(得分:0)

您是否尝试过设置

Config = nil
Query = nil
Session = nil
[session finishTasksAndInvalidate]

结束?但我个人更关心为什么你需要提出5000个请求?对我来说似乎设计不好......