gpt4 book ai didi

ios - NSURLSession HTTP/2 内存泄漏

转载 作者:技术小花猫 更新时间:2023-10-29 11:07:50 26 4
gpt4 key购买 nike

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

test1:iOS 9.HTTP/2 服务器

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

测试2:iOS 9.HTTPs1.1服务器

我用https1.1的文件服务器测试了同样的代码,我取消上传任务或者不取消,一切正常,内存恢复正常。(10M数据释放)

test3 iOS 8.HTTP/2 服务器

这种情况下一切正常。(NSURLSession 没有协议(protocol)协商到 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

最佳答案

来自苹果文档:

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(),因为您正在为每个请求创建 session

关于ios - NSURLSession HTTP/2 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39409357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com