Le retour de la gestion mémoire en javascript

Le
WebShaker
Salut.

Bon j'essaye de faire un truc propre.
j'ai un application sensé fonctionner entièrement en javascript sans
jamais rafraichir la page.

donc je crée des objet et a un moment il faut que j'en supprime plein.
donc
Ces objects existent dans le DOM mais aussi dans certaine variable
javascript.

Comment virer tous ces objets?
Est ce que un simple oHTMl.innerHTML = '';
va me virer proprement tous les objects du DOM ?
ou est ce que je dois les virer récursivement ?
ou bien virer simplement le premier avec un removeChild ?

Qu'advient il des pointeur sur ces object que j'ai dans mes variable
javascript ?
Est ce que le fait d'avoir des pointeurs sur ces objet empeche leur
réelle destruction?
Est ce que détruire l'objet qui contient tous ces pointeurs va libérer
tous ces pointeurs (sous réserve que ce soit necessaire).

Bref. plein de questions :)
Bon je vais faire des tests, mais il y a tellement de combinaison à
verifier que si quelqu'un a deja un début d'info la dessus c'est pas
plus mal?

Merci
Etienne
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
SAM
Le #21766951
Le 5/7/10 10:23 AM, WebShaker a écrit :
Salut.

Bon j'essaye de faire un truc propre.
j'ai un application sensé fonctionner entièrement en javascript sans
jamais rafraichir la page.

donc je crée des objet et a un moment il faut que j'en supprime plein.
donc...
Ces objects existent dans le DOM mais aussi dans certaine variable
javascript.

Comment virer tous ces objets?
Est ce que un simple oHTMl.innerHTML = '';
va me virer proprement tous les objects du DOM ?



beaucoup conseillent cette méthode

document.getElementsByTagName('body')[0].innerHTML = '';
et hop là !

ou est ce que je dois les virer récursivement ?



Pas ni compris ce que ça veut dire.

Amusement :

var m = [];
var b = document.getElementsByTagName('body')[0],
d = b.getElementsByTagName('*'), n=d.length;
while(n--) m.push(d[n]);
b.innerHTML = '';
n = m.length;
setTimeout(function() {while(n--)b.appendChild(m[n])},5000);

Houlala ! Ça doit faire un sacré micmac c'truc !

ou bien virer simplement le premier avec un removeChild ?



removeChild, il y a des chances que ça n'enlève rien de la mémoire
(des fois que tu voudrais remettre ce child plus tard)
ça s'appelle 'remove' pas 'suppress' ... ni 'delete'
(on l'enlève mais ni le supprime ni l'efface)

Le même micmac mais avec removeChild :

while(n--) m.push(d[n].parentNode.removeChild(d[n]));
b.innerHTML = '';
n = m.length;
setTimeout(function() {while(n--)b.appendChild(m[n])},5000);

Qu'advient il des pointeur sur ces object que j'ai dans mes variable
javascript ?



tu mets tous tes pointeurs à null
si tu as un doute.

M'enfin le pointeur sur l'élément qui est devenu ''
ça ne doit plus occuper plus que si cette variable est devenu null
(à mon idée, que ne partage peut-être pas M$)


Est ce que le fait d'avoir des pointeurs sur ces objet empeche leur
réelle destruction?



L'objet vidé est vidé, le pointeur suit l'objet, il pointe donc sur du
vide, ça ne posera de blème qu'à l'éventuel ré-emploi ultérieur de ce
pointeur qui pourra alors gueuler à l'erreur.

<div id="truc">
blabla <span>exemple</span blabla
</div>

var d = document.getElementById('truc');
d.innerHTML = '';
alert(d.getElementsByTagName('SPAN')[0].innerHTML);


Est ce que détruire l'objet qui contient tous ces pointeurs va libérer
tous ces pointeurs (sous réserve que ce soit necessaire).



Là ... de la part de M$ je ne suis pas certain ... :-(
pas rien compris aux fuites de mémoire d'IE.

--
sm
WebShaker
Le #21780911
Le 07/05/2010 12:00, SAM a écrit :
Comment virer tous ces objets?
Est ce que un simple oHTMl.innerHTML = '';
va me virer proprement tous les objects du DOM ?



beaucoup conseillent cette méthode



Ok super. c'est de loin le plus simple.

removeChild, il y a des chances que ça n'enlève rien de la mémoire
(des fois que tu voudrais remettre ce child plus tard)
ça s'appelle 'remove' pas 'suppress' ... ni 'delete'
(on l'enlève mais ni le supprime ni l'efface)



Hum.
alors la j'ai des doutes...
supposons que tu ai un div (oDiv) contant plaine d'autre div.
donc oDiv.innerHTML = '';
va virer tous les object fils... soit.
mais comment tu vires oDiv ?

tu ne veut pas faire oDiv.parentNode.innerHTML = '' car tu ne souhaite
pas virer ses frères mais uniquement lui.

Donc a mon avis, une fois le remove fait, si plus aucune variable
javascript ne référence cet objet il devrait être supprimé.

Etienne
SAM
Le #21794771
Le 5/7/10 1:59 PM, WebShaker a écrit :
Le 07/05/2010 12:00, SAM a écrit :
Comment virer tous ces objets?
Est ce que un simple oHTMl.innerHTML = '';
va me virer proprement tous les objects du DOM ?



beaucoup conseillent cette méthode



Ok super. c'est de loin le plus simple.



Le plus simple,
le plus clean,
le plus court en lignes de code,
et peut-être le plus rapide ?
(je ne sais si le DOM se reconstruit alors dans son entier en arrière-plan).

removeChild, il y a des chances que ça n'enlève rien de la mémoire
(des fois que tu voudrais remettre ce child plus tard)
ça s'appelle 'remove' pas 'suppress' ... ni 'delete'
(on l'enlève mais ni le supprime ni l'efface)



Hum.
alors la j'ai des doutes...
supposons que tu ai un div (oDiv) contant plaine d'autre div.
donc oDiv.innerHTML = '';
va virer tous les object fils... soit.
mais comment tu vires oDiv ?



oDiv = null;
non ?

tu ne veut pas faire oDiv.parentNode.innerHTML = '' car tu ne souhaite
pas virer ses frères mais uniquement lui.



ben ... oDiv n'est pas le DIV du html, me semble t-il.

Si vraiment ça te chagrinne de garder un reliquat de div vide et
définitivement plus utile :

oDiv.innerHTML = '';
oDiv = oDiv.parentNode.removeChild(oDiv);
oDiv = null;

crack ! boum ! La totale !

... si on aime compliquer et s'assurer,
peut-être ?
(étant assez loin de ces préoccupations)


Donc a mon avis, une fois le remove fait, si plus aucune variable
javascript ne référence cet objet il devrait être supprimé.



Ce serait le plus probable, ou attendu mais ...
j'en sais rien.

Là c'est pour du Flash ( o = remove(o); o = null;) :
(il y a bp d'infos sur le Net à propos de la mémoire en Flash)

mais Google arrive à trouver des trucs pour JS qui vont dans le sens que
je propose.

Aussi un truc à propos de la mémoire et ses fuites :
dont l'Exhibit 11

--
sm
Publicité
Poster une réponse
Anonyme