【发布时间】:2015-10-31 06:52:34
【问题描述】:
在我的应用程序(一个 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 进行分析并没有发现任何内存泄漏,所以我很困惑。任何帮助或建议将不胜感激。
【问题讨论】:
-
关于为什么需要 5000 个会话的更多信息?听起来你在这里与 iOS 对抗,这是一个疯狂的高数字?
-
@Ben 这是一个 Mac 应用程序,而不是 iOS 应用程序。基本上,它 24/7 全天候运行并对大量数据进行分析。这是很多请求,但机器自然有互联网连接来处理它。我还应该提到,我尝试重用会话而不是为每个请求创建一个新会话,但无济于事。
标签: ios swift macos memory nsurlsession