NSURLSession HTTP/2 内存泄漏问题

10

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

测试1:iOS 9、HTTP/2服务器

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

测试2:iOS 9、HTTPS1.1服务器

我使用相同的代码与HTTPS1.1文件服务器进行测试,无论我是否取消上传任务,一切正常,内存恢复正常(10M数据被释放)。

测试3:iOS 8、HTTP/2服务器

在这种情况下,一切正常(NSURLSession未协商到HTTP/2)。

因此,即使我在使用NSURLSession时有些不当,NSURLSession在HTTP/2下的性能也不正常。

除了内存问题外,在使用NSURLSession和HTTP/2上传文件时,进度段的大小很大(可能是一个回调中的2M“didSendBodyData”)。

我也阅读了这一页。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

1
发布你的代码。 - Segev
已经添加了一个测试项目的链接并编辑了原始问题。感谢您的时间。@Segev - rotoava
我建议您在上传大文件时使用uploadTaskWithStreamedRequest。 - Teemu Ikonen
1个回答

1

来自苹果文档:

会话对象会保持对委托的强引用,直到您的应用程序退出或明确使会话无效。如果您不使会话无效,则在应用程序退出之前,您的应用程序将泄漏内存。

另外,查看您的项目 https://github.com/upyun/swift-sdk/tree/testleak,由于您每个请求都创建一个会话,因此需要在sessionTask.resume()之后调用finishTasksAndInvalidate()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接