Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Le retour de la gestion mémoire en javascript

3 réponses
Avatar
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

3 réponses

Avatar
SAM
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
Avatar
WebShaker
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
Avatar
SAM
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;) :
<http://flash.mediabox.fr/index.php?showtopicˆ900&gt" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://flash.mediabox.fr/index.php?showtopicˆ900&gt;
(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 :
<http://flash.mediabox.fr/index.php?showtopicˆ900&gt" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://flash.mediabox.fr/index.php?showtopicˆ900&gt;
dont l'Exhibit 11

--
sm