NSURLSession HTTP/2 内存泄漏

Posted

技术标签:

【中文标题】NSURLSession HTTP/2 内存泄漏【英文标题】:NSURLSession HTTP/2 memory leak 【发布时间】:2017-01-17 11:22:09 【问题描述】:

这是我的测试用例,指出当使用带有 HTTP/2 连接的 NSURLSession 时存在内存问题。

test1:iOS 9. HTTP/2 服务器

我使用NSURLSession将10M文件上传到HTTP/2服务器,如果文件上传完成一切正常,但如果我在上传任务完成之前取消,10M永远不会释放。

test2:iOS 9.HTTPS1.1 服务器

我用https1.1文件服务器测试相同的代码,我取消上传任务还是没有,一切正常,内存恢复正常。(10M数据释放)

test3 iOS 8. HTTP/2 服务器

这种情况一切正常。(NSURLSession 没有与 HTTP/2 进行协议协商)

所以,即使有一些不适合我使用 NSURLSession 的地方,NSURLSession 的性能在 HTTP/2 上也不正常。

除了内存问题,当使用 NSURLSession 和 HTTP/2 上传文件时,进度段大小很大(一次回调可能 2M 'didSendBodyData')

我也读过this page。 SSL可能会缓存一些东西,但不应该缓存整个文件。(当我取消任务或请求超时时,10M文件大小的内存泄漏)

任何人都知道导致问题的原因,可以给我一些帮助。 谢谢。


问题更新 0912:添加测试项目链接

测试项目:https://github.com/upyun/swift-sdk/tree/testleak

file:UPUtils.swift
//Change the url to make comparison test. 

//let DEFAULT_UPYUN_FORM_API_DOMAIN = "http://v0.api.upyun.com"//http1.1
//let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://httpbin.org/post" //https1.1
let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://v0.api.upyun.com"//http2

【问题讨论】:

发布您的代码。 已添加到测试项目的链接并编辑了原始问题。谢谢你的时间。 @Segev 我建议您使用 uploadTaskWithStreamedRequest 进行大型上传 【参考方案1】:

来自苹果文档:

会话对象保持对委托的强引用,直到您的应用退出或显式使会话无效。如果您不使会话无效,则您的应用会泄漏内存,直到退出。

同时查看您的项目https://github.com/upyun/swift-sdk/tree/testleak,您需要在 sessionTask.resume() 之后调用 finishTasksAndInvalidate(),因为您正在为每个请求创建会话

【讨论】:

以上是关于NSURLSession HTTP/2 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSURLSession.downloadTaskWithURL 时的内存泄漏

C++:内存泄漏

iOS10 NSURLSession HTTP/2 无效

带有 NSURLSession 的 Http/2 server_push

链表切割的内存泄漏

data.table 中的内存泄漏按引用分组分配