代码之家  ›  专栏  ›  技术社区  ›  rotoava

NSURLSession HTTP/2内存泄漏

  •  10
  • rotoava  · 技术社区  · 8 年前

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

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

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

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

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

    test3 iOS 8.HTTP/2服务器

    这种情况下一切正常。(NSURLSession未与HTTP/2进行协议协商)

    因此,即使我使用NSURLSession有一些不合适的地方,但使用HTTP/2时,NSURLSsession的性能也不正常。

    除了内存问题外,当使用带有HTTP/2的NSURLSession上载文件时,进度段的大小非常大(5月2日,一次回调时,“didSendBodyData”)

    我也读过 this page

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


    问题更新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 回复  |  直到 7 年前
        1
  •  1
  •   Tomasz Czyżak    7 年前

    会话对象将保持对代理的强引用,直到应用程序退出或显式使会话无效。如果你不使会话无效,你的应用程序会泄漏内存直到退出。

    同时查看您的项目 https://github.com/upyun/swift-sdk/tree/testleak 您需要在sessionTask之后调用finishTasksAndInvalidate()。resume(),因为您正在为每个请求创建会话