2016-09-09 35 views
10

Ten przypadek My Test wskazuje, że podczas korzystania z NSURLSession z połączeniem HTTP/2 występuje problem z pamięcią.NSURLSession HTTP/2 wyciek pamięci

test1: iOS 9. HTTP/2 serwer

używam NSURLSession przesłać plik do 10M/serwera HTTP 2, jeżeli dodany plik zakończone wszystko jest ok, ale jeśli mogę anulować zadanie przesyłania przed jest ukończony, 10M nigdy się nie zwolni.

test2: iOS 9. HTTPs1.1 serwer

przetestować ten sam kod z serwerem plików https1.1, mogę anulować zadanie przesyłania lub nie, wszystko jest ok, pamięć wraca do normy. (dane 10M jest zwolniony)

TEST3 iOS 8. HTTP/serwer 2

Ta sprawa wszystko jest ok. (NSURLSession nie do negocjacji protokołu HTTP/2)

Tak więc Nawet jeśli jest coś, co nie jest odpowiednie przy korzystaniu z NSURLSession, wydajność NSURLSession nie jest normalna w przypadku HTTP/2.

Poza problemem pamięci, podczas korzystania NSURLSession z HTTP/2 do przesyłania pliku wielkość segmentu postęp jest ogromny (może 2m „didSendBodyData” na jednej oddzwaniania)

Ja też czytałem this page. Protokół SSL może buforować niektóre rzeczy, ale nie powinien buforować całego pliku. (Kiedy anuluję zadanie lub żądanie przekroczono limit czasu, wycieki pamięci o rozmiarze pliku 10M)

Ktoś wie, co jest przyczyną problemu, może udzielić mi pomocy. Dzięki.


aktualizacja Pytanie 0912: dodaj link projekt testowy

projekt testowy: 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

kod pocztowy. – Segev

+0

Dodał link do projektu testowego i \t edytował pytanie dotyczące pochodzenia. Dziękuję za Twój czas. @Segev – rotoava

+0

Polecam użyć uploadTaskWithStreamedRequest dla dużych uploadów –

Odpowiedz

1

od Apple Doc:

Przedmiotem sesji utrzymuje silne odniesienie delegatowi do momentu, gdy Twoja aplikacja wyjdzie lub jawnie unieważni t on sesja. Jeśli sesja nie zostanie unieważniona, aplikacja wycieka z pamięci do momentu jej wyjścia.

patrząc Również w projekcie https://github.com/upyun/swift-sdk/tree/testleak trzeba zadzwonić finishTasksAndInvalidate() po sessionTask.resume(), ponieważ podczas tworzenia sesji na żądanie