NSURLSession HTTP / 2内存泄漏

这个我的testing案例,指出当使用NSURLSession与HTTP / 2连接时有内存问题。

test1:iOS 9. HTTP / 2服务器

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

test2:iOS 9. HTTPs1.1服务器

我用https1.1文件服务器testing了相同的代码,我取消了上传任务,一切正常,内存恢复正常(10M数据发布)

test3 iOS 8. HTTP / 2服务器

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

所以,即使有一些不适合我的使用NSURLSession,NSURLSession的性能与HTTP / 2不正常。

除了内存问题之外,当使用NSURLSession和HTTP / 2来上传文件时,进度段的大小是巨大的(一次callback5月2日“didSendBodyData”

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

任何人知道是什么原因造成的问题,可以给我一些帮助。 谢谢。


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

testing项目: 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 

从苹果文件:

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

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