JScript Wycieki pamięci

Original: http://javascript.crockford.com/memory/leak.html

Gdy system nie poprawnie zarządzać przydziałami pamięci, to mówi się, że wycieki pamięci.Wyciek pamięci jest błąd. Objawy mogą obejmować zmniejszoną wydajność i porażki.

Microsoft Internet Explorer zawiera wiele przecieków, z których najgorsze jest interakcja z JScript. Gdy obiekt DOM zawiera odwołanie do obiektu JavaScript (takich funkcji obsługi zdarzeń), a kiedy ten obiekt JavaScript zawiera odniesienie do tego obiektu DOM, a następnie tworzy się struktura cykliczna. To nie jest samo w sobie problemem. W takim czasie, nie istnieją żadne inne odniesienia do obiektu DOM i obsługi zdarzeń, a następnie garbage collector (automatyczny menedżer zasobów pamięci) będzie im odzyskać zarówno, umożliwiając ich przestrzeń zmienić przeznaczenie.Garbage Collector JavaScript rozumie o cyklach i nie jest zdezorientowany przez nich. Niestety, IE DOM nie jest zarządzane przez JScript. Posiada własny menedżer pamięci, że nie rozumie o cyklach i tak dostaje bardzo mylić. W rezultacie, kiedy występują cykle regeneracji pamięci nie występuje.Pamięć, która nie jest odzyskiwana jest powiedziane, że wyciekły. Z biegiem czasu, może to prowadzić do głodu pamięci. W obszarze pamięci pełne używanych komórek, przeglądarka głodzi się na śmierć.

Możemy wykazać. W pierwszym programie, queuetest1 stworzymy 10000 DOM elementy (Span), a w tym samym czasie, usunąć prawie wszystkie 10 ostatnich. Po uruchomieniu go z wyświetlaczem wydajność zadań Windows Manager, można zauważyć, że PF (pliku stronicowania) Wykorzystanie pozostaje na stałym poziomie. Zmiany na PF Wykorzystanie może być wskaźnikiem alokacji pamięci nieefektywności.

Następnie należy uruchomić drugi program, queuetest2. To nie to samo, co queuetest1, poza tym, że dodaje obsługi kliknij, aby każdy element. Mozilla i Opera, Wykorzystanie PF jest o tym samym, ale na IE widzimy stały wzrost, jak wycieki pamięci się w tempie około megabajta na sekundę. Często ten wyciek jest niezauważalny. Ale jak techniki Ajax stać się bardziej popularne, ze strony pobytu w miejscu dłużej, jest poddawana wielu zmian, niewydolność staje się powszechne.

Ponieważ IE nie jest w stanie wykonywać swoje zadania i odzyskać cykle, to spadnie na nas, aby to zrobić. Jeśli jawnie łamać cykle, to IE będzie w stanie odzyskać pamięć. Według Microsoftu, zamknięcia są przyczyną wycieków pamięci. Jest to oczywiście głęboko niewłaściwym, ale prowadzi do Microsoft daje bardzo złe porady dla programistów, jak radzić sobie z błędami Microsoft. Okazuje się, że jest to łatwe do złamania cykli po stronie DOM. Jest to praktycznie niemożliwe, aby je łamać na stronie JScript.

Gdy skończymy z elementem, musimy wartość null z wszystkich jego obsługi zdarzeń łamać cykle. Wszystko, co musimy zrobić, to przypisać wartość null własności Każda procedura jest. Można to zrobić bardzo dokładnie, czy możemy zrobić ogólną funkcję oczyszczania.

Funkcja przewietrzania ma odniesienie do elementu DOM jako argument. W pętli atrybutami elementów. Jeśli stwierdzi żadnych funkcji, to null je. To przerwanie cyklu, dzięki czemu pamięci do regeneracji. Będzie również spojrzeć na wszystkie elementy podrzędne elementu, i pozbyć się wszystkich swoich cykli, jak również.Funkcja przewietrzania jest nieszkodliwe Mozilla i Opera. Jest to istotna, IE.Funkcja przewietrzania powinien być nazywany przed usunięciem jakiegokolwiek elementu, albo przy użyciu metody removeChild lub poprzez ustawienie właściwości innerHTML.

function purge(d) {
var a = d.attributes, i, l, n;
if (a) {
for (i = a.length – 1; i >= 0; i -= 1) {
n = a[i].name;
if (typeof d[n] === ‘function’) {
d[n] = null;
}
}
}
a = d.childNodes;
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
purge(d.childNodes[i]);
}
}
}

Więc wreszcie uruchomić trzeci program queuetest3. W nim, funkcja przedmuchu nazywa się po prostu przed usunięciem elementów DOM.

Należy pamiętać, że koparki, które zostały dodane z attachEvent (), nie będzie można znaleźć i będzie przeciekać.

Aktualizacja: Firma Microsoft wydała poprawkę do tego problemu: 929874. Jeśli można mieć pewność, że wszyscy użytkownicy przyjęli poprawkę, to nie jest już konieczne, aby oczyścić. Niestety, nie jest możliwe, aby określić, że tak oczyszczanie prawdopodobnie być konieczny do końca życia produktu IE6 jest.

Jest to rodzaj sieci. Poprawianie błędów nie robi błędy odejść.

Aktualizacja: Ok, IE7 nie naprawić go. Może IE8 będzie to naprawić.

 

Comments are closed.