Утечка памяти NSURLSession HTTP/2

В этом разделе "Мои тесты" указывается, что при использовании 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 с HTTP/2 для загрузки файла размер сегмента прогресса огромен (май 2M "didSendBodyData" при одном обратном обращении)

Я также прочитал эту страницу. SSL может кэшировать некоторые вещи, но не должен кэшировать весь файл. (Когда я отменяю задачу или время ожидания запроса, утечки памяти размера 10 М)

Кто-нибудь знает, что может вызвать проблему, может мне помочь. Благодарю.


Обновление вопроса 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

Из apple doc:

Объект сеанса сохраняет значительную ссылку на делегата, пока ваше приложение не выйдет или явно не отменяет сеанс. Если вы не сделали недействительным сеанс, ваше приложение теряет память до тех пор, пока оно не выйдет.

Также, глядя на ваш проект https://github.com/upyun/swift-sdk/tree/testleak, вам нужно вызвать finishTasksAndInvalidate() после sessionTask.resume(), так как вы создаете сеанс за запрос

Ответ 2

Как вы решаете эту проблему, я получил тот же вопрос