2016-09-09 1 views
10

Ce cas My Test indique que l'utilisation de NSURLSession avec une connexion HTTP/2 pose un problème de mémoire.NSURLSession Fuite de mémoire HTTP/2

test1: iOS 9. HTTP/2 serveur

J'utilise NSURLSession pour télécharger le fichier de 10M à un serveur HTTP/2, si le fichier uploadé tout terminé est ok, mais si j'annule la tâche de téléchargement avant c'est terminé, le 10M ne sortira jamais.

test2: iOS 9. Je teste HTTPs1.1 serveur

le même code avec un serveur de fichiers https1.1, annuler la tâche de téléchargement ou non, tout est ok, la mémoire à la normale. (10M données sont publiées)

iOS test3 8. HTTP/2 serveur

Ce cas, tout est ok. (NSURLSession n'a pas la négociation de protocole HTTP/2)

Donc, même s'il y a quelque chose qui ne convient pas avec mon utilisation de NSURLSession, les performances de NSURLSession ne sont pas normales avec HTTP/2.

Outre problème de mémoire, lors de l'utilisation NSURLSession avec HTTP/2 pour télécharger le fichier de la taille du segment de progression est énorme (mai 2M « didSendBodyData » à un rappel)

J'ai aussi lu this page. SSL peut mettre en cache quelque chose, mais ne doit pas mettre en cache le fichier entier (lorsque j'annule la tâche ou la requête expire, la mémoire de taille de fichier 10M fuit)

N'importe qui Connaît ce qui cause le problème, pourrait m'aider. Merci.


Question mise à jour 0912: ajouter un projet de test lien

projet de test: 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

votre code postal. – Segev

+0

A ajouté un lien vers un projet de test et \t a édité la question d'origine. Merci pour votre temps. @Segev – rotoava

+0

Je vous recommande d'utiliser uploadTaskWithStreamedRequest pour les gros téléchargements –

Répondre

1

De doc pomme:

L'objet de session conserve une référence forte au délégué jusqu'à ce que votre application quitte ou invalide explicitement t La session Si vous n'invalidez pas la session, votre application perd de la mémoire jusqu'à ce qu'elle se ferme.

également à la recherche de votre projet https://github.com/upyun/swift-sdk/tree/testleak vous devez appeler finishTasksAndInvalidate() après sessionTask.resume() puisque vous créez la session par demande