IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Ajax et usage mémoire


Sujet :

AJAX

  1. #1
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut [AJAX] Ajax et usage mémoire
    Bonjour,

    J'utilise de plus en plus Ajax dans mes applications Web et il m'arrive souvent lorsque je travaille longtemps sans rafraîchir la page de recevoir un avertissement de la part de Chrome disant que le processus commence à utiliser trop de mémoire. Peu de temps après, mon application devient lente et instable.

    J'ignore cependant ce qu'il faudrait que je fasse pour libérer la mémoire utilisée par les requêtes Ajax. Voici le code d'une page PHP qui permet d'expérimenter mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <?php
    if(isset($_POST["octets"])) {
    	echo str_pad("", $_POST["octets"], 0);
    	exit;
    }
    ?>
    <html>
    	<head>
    		<script type="text/javascript">
    			function load_data(octets) {
    				var xmlHttp = GetXmlHttpObject();
    				if(xmlHttp == null) return false;
    				else {
    					method = "POST";
    					target = window.location.href.substring(window.location.href.lastIndexOf("/")+1,window.location.href.length) + "?sid="+Math.random();
    					asynchronous = true;
    					xmlHttp.onreadystatechange = function() {
    						if(xmlHttp.readyState == 4) {
    							var el = document.createElement('div');
    							el.setAttribute('data', xmlHttp.responseText);
    							document.body.appendChild(el);
    							el.style.border = "2px solid #0000FF";
    							el.style.width = "250px";
    							el.style.height = "25px";
    							el.innerHtml = octets;
    							el.onclick = function(e) { document.body.removeChild(this); delete this; };
    							delete(xmlHttp);
    							delete el;
    						};
    					}
    					xmlHttp.open(method,target,asynchronous);
    					xmlHttp.setRequestHeader('Cache-Control', 'no-cache');
    					xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=ISO-8859-15');
    					xmlHttp.send("octets="+octets);
    				}
    			}
    			function GetXmlHttpObject(){
    				var objXMLHttp = null;
    				if (window.XMLHttpRequest){
    					try { objXMLHttp = new XMLHttpRequest(); }
    					catch(e) { objXMLHttp = false; }
    				}
    				else {
    					if(window.createRequest) {
    						try { objXMLHttp = new window.createRequest(); }
    						catch(e) { objXMLHttp = false; }
    					}
    					else {
    						if(window.ActiveXObject) {
    							try { objXMLHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    							catch(e) {
    								try { objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
    								catch(e) { objXMLHttp = false; }
    							}
    						}
    					}
    				}
    				return objXMLHttp;
    			}
    		</script>
    	</head>
    	<body>
    		<input type="button" value="1 Mo" style="width:150px; float:left;" onclick="load_data(1048576);" /><br /><br />
    	</body>
    </html>
    Remarquez que chaque click sur le bouton appelle au chargement de 1Mo (approx.) de données via Ajax. Dans Windows 7 32 bit, j'utilise le gestionnaire de tâche pour suivre l'utilisation mémoire du processus chrome.exe et cette valeur croit beaucoup à chaque fois que j'appuie sur le bouton. La quantité de mémoire utilisée ne redescend pas vraiment, pas même lorsque je clique sur les rectangles bleu sensés contenir les données chargées pour les retirer du document. Rafraîchir la page semble réduire l'utilisation de mémoire mais ne ramène pas cette donnée à sa valeur initiale.

    Comment puis-je faire pour libérer toute la mémoire correctement suite à mes requêtes Ajax?

    EDIT : Mise à jour de l'extrait de code incluant des tentatives de libérer l'espace occupé par les variables.
    Pensez à la balise

  2. #2
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Petite mise à jour,

    Ce problème survient autant sur Windows 7 que sur Fedora 16, les deux systèmes sur lesquels mon application est utilisée. Aussi, dans les faits, ce n'est pas Chrome qui m'avise d'un usage mémoire excessif mais mon antivirus AVG. J'utilise normalement JQuery lorsque je travaille dans le DOM car il gère plus efficacement la mémoire mais même avec JQuery le résultat est le même.

    Après 124 consultations de ce billet, je n'ai reçu aucune réponse, je m'en remet donc aux plus expérimentés pour répondre à la question suivante : Si il n'existe pas de solution facile à ce problème, à quoi est-ce dû et comment puis-je contourner le problème?
    Pensez à la balise

Discussions similaires

  1. [AJAX] Appolo 13 - Fuite mémoire avec XHR
    Par mecatroid dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/09/2007, 14h52
  2. [AJAX] XHR a usage unique?
    Par Gruik dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/10/2006, 10h42
  3. [AJAX] Ajax et les accents
    Par nico-pyright(c) dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 09/12/2005, 20h09
  4. [AJAX] Ajax et javascript contenu
    Par zekey dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 30/09/2005, 20h16
  5. [AJAX] AJAX et javascript
    Par spud5351 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/09/2005, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo