NSURLSession HTTP/2 内存泄漏

NSURLSession HTTP/2 memory leak

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

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 with HTTP/2上传文件时,进度段大小很大(一次回调可能2M 'didSendBodyData')

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

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


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

测试项目: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

来自苹果文档:

The session object keeps a strong reference to the delegate until your app exits or explicitly invalidates the session. If you don’t invalidate the session, your app leaks memory until it exits.

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