2011-06-25 10 views
5

Wiem, że to pytanie zostało zadane wcześniej, ale żadna z odpowiedzi nie rozwiązuje problemu. Testuję stronę AJAX, która aktualizuje elementy w DOM za pomocą javascript.Aktualizowanie DOM przez Javascript powodujące wycieki pamięci (tylko w Firefox?)

Co minutę serwer jest pytany o nowe dane, a DOM jest odpowiednio aktualizowany. Z tego co wiem, zużycie pamięci dla tej strony w Chrome rośnie, ale nie za dużo (zaczyna się około 40 MB i osiąga maks. 80 MB). W Firefoksie wykorzystanie pamięci zaczyna się od około 120 MB i może wzrosnąć do ponad 400 MB. Przejrzałem JavaScript z Firebug i wydaje mi się, że pamięć rozwija się najbardziej, gdy DOM jest aktualizowany za pomocą moich metod Javascript.

Manipulacja DOM jest proste, takie jak:

var myTable = document.createElement("table"); 

var thead = document.createElement("thead"); 
var tr = document.createElement("tr"); 
var th = document.createElement("th"); 
th.appendChild(document.createTextNode("column1")); 
tr.appendChild(th); 

for(var test in obj.testObjs){ 
    th = document.createElement("th"); 
    th.appendChild(document.createTextNode(obj.testObjs[test].myVar)); 
    tr.appendChild(th); 
} 

Przed dołączanie nowych danych do węzłów DOM, najpierw usunąć istniejące dane. Próbowałem na różne sposoby, w tym co jest opisane tutaj: How to remove DOM elements without memory leaks?

a także w prosty sposób, takich jak:

function clearChildren(node){ 
    if(node != null){ 
     while (node.hasChildNodes()) node.removeChild(node.firstChild); 
    } 
} 

Ja również czytać (Cyclic adding/removing of DOM nodes causes memory leaks in JavaScript?), że przeglądarki rozpocząć tylko zbieranie śmieci kiedy osiągnie określony poziom? Czy to może być potwierdzone? Czuję, że po pewnym czasie mój komputer działa powoli z powodu rosnącej pamięci.

Uważam, że musi istnieć rozwiązanie tego problemu, ponieważ komercyjne witryny, które przetestowałem i wykonują te same czynności, nie powodują wzrostu zużycia pamięci.

Każda pomoc zostanie bardzo doceniona.

Dziękuję.

Odpowiedz

2
innerHTML='' 

Czy niewłaściwy sposób przygotować zmienną do obsługi GC.
Musisz użyć funkcji delete na elemencie i każdym elemencie, do którego odnosi się ten element.
Dużo, prawda?
Dlatego mamy biblioteki JS, w których zostały napisane dla nas. Sprawdziłem kod w Mootools (pobierz go i wyszukaj zniszcz) i wydaje mi się, że został napisany poprawnie.
Myślę, że będzie tak samo w innych bibliotekach.

+0

Dzięki za odpowiedź - czy Mootools zakłóca działanie JQuery? Używam JQuery na mojej stronie, a kiedy próbuję użyć funkcji Mootools destroy(), pojawia się błąd JS z informacją, że "destroy() nie jest funkcją" – user172092

+0

Musisz poprawnie ustawić, aby grać razem (w moja strona to ładnie). Podobnie jak zamiast używać '$' w kodzie zależnym Mootools, musisz użyć selektorów 'document.id ('...') ' –

+0

Dziękuję - wygląda na to, że użycie pamięci nie rośnie stale i widzę, że czasami się kurczy. Doceniam twoją pomoc. – user172092

3

Czy to może być potwierdzone?

To zależy.

Ogólnie przeglądarki będą GC, gdy będą miały na to ochotę, a heurystyki mogą się dość często zmieniać. Podejrzewam, że jeśli spróbujesz Firefoksa co noc, zobaczysz całkiem inne zachowanie niż to, które opisałeś powyżej. Od czasu wydania Firefoksa 5 nastąpiły co najmniej 2 zmiany heurystyczne GC.

+0

Jaką wersję FF teraz jesteśmy? Zgubiłem utwór –

+0

Firefox 5 jest bieżącym wydaniem stabilnym. 6 zaplanowano na połowę sierpnia. –

Powiązane problemy