gpt4 book ai didi

ios - NSURLSession - 高内存使用率

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:19 25 4
gpt4 key购买 nike

在我的应用程序(一个 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(),但这一切都没有任何区别 - 内存使用率总是 swift 攀升并永久保持高位。

这是个大问题,因为我的应用需要定期发送这些请求,而内存随着每个周期的增加而攀升——最终达到几 GB 的 RAM。还应注意,一旦内存使用量达到这一点,我的程序就会变慢。

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

最佳答案

两件事:

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

    我发现每个 session 的内存消耗不大,如果您有大量的 session ,它可以加起来

  2. 您说您运行 Instruments 是为了查找泄漏。如今,你很少会发现像那样令人震惊的事情。但是您还应该通过分析两个时间点之间的分配或世代来寻找强大的引用周期等,并确定 什么 占 250mb,然后查看它的分配位置等。

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

关于ios - NSURLSession - 高内存使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33448914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com