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(),因为您是根据请求创建会话
这是我的测试用例,指出当使用 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(),因为您是根据请求创建会话