在我的应用程序(OS X应用程序)中,我在短时间内发送大约5,000个URL请求,以从服务器检索JSON对象。我同时发送50个请求,等待所有请求完成,然后再发送50个批次。但是我有一些内存管理问题...NSURLSession - 高内存使用率
当所有请求都完成时(〜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的内存。还应该注意的是,一旦内存使用达到这一点,我的程序就会慢慢爬行。
有谁知道为什么NSURLSession
可能会保留这么多的内存?使用仪器进行分析不会发现任何内存泄漏,所以我非常难以忍受。任何帮助或建议将不胜感激。
有关您为什么需要5000个会话的更多信息?听起来你在这里与iOS工作,这是一个疯狂的高数字? – Ben
@Ben这是一个Mac应用程序,而不是iOS应用程序。基本上,它全天候运行并对大量数据进行分析。这是很多要求,但机器自然有互联网连接来处理它。我还应该提到,我试过重复使用会话,而不是为每个请求创建一个新会话,但无济于事。 – hundley