Co to jest JavaScript garbage collection?

Co to jest JavaScript garbage collection? Co jest ważne, aby programista webowy zrozumiał o usuwaniu śmieci w JavaScript, aby napisać lepszy kod?

Author: Noldorin, 2009-05-14

9 answers

Eric Lippert napisał / a szczegółowy wpis na blogu o tym temacie jakiś czas temu (dodatkowo porównując go do VBScript). Dokładniej napisał o JScript, który jest własną implementacją ECMAScript Microsoftu, choć bardzo podobną do JavaScript. Wyobrażam sobie, że można założyć, że zdecydowana większość zachowań będzie taka sama dla silnika JavaScript Internet Explorera. Oczywiście implementacja będzie się różnić w zależności od przeglądarki przeglądarka, choć podejrzewam, że można wziąć szereg wspólnych zasad i zastosować je do innych przeglądarek.

Cytat z tej strony:

JScript używa nieeneracyjnego mark-and-sweep garbage collector. Informatyka działa tak:

  • Każda zmienna, która jest " w zakresie" nazywa się "padlinożercą". Padlinożerca może odnosić się do liczby, przedmiotu, a sznurek, nieważne. Prowadzimy listę of scavengers -- zmienne są przenoszone na listę scav when they come do zakresu i z listy scav, gdy wychodzą poza zasięg.

  • Co jakiś czas śmieci kolektor działa. Najpierw stawia "mark" Na każdym obiekcie, zmienna, string, etc-cała pamięć śledzona przez GC. (JScript używa wariantu struktura danych wewnątrz i tam jest mnóstwo dodatkowych nieużywanych bitów w tej struktury, więc ustawiamy jedną z oni.)

  • Po drugie, czyści ślad na padlinożercy i transitive closure od padlinożerców. Więc jeśli scavenger object referents a obiekt nonscavenger wtedy wyczyścimy bity na nonscavenger i na wszystko, do czego się odnosi. (Jestem używając słowa "zamknięcie" w inny sens niż w moim wcześniejszym poczta.)

  • W tym momencie wiemy, że wszystkie pamięć nadal zaznaczona jest przydzielana pamięć, której nie może osiągnąć żaden ścieżka z dowolnej zmiennej w zakresie. Wszystkie z tych obiektów są poinstruowane, aby łza się w dół, co niszczy wszelkie odniesienia okrągłe.

Głównym celem garbage collection jest umożliwienie programiście , a nie martwienia się o zarządzanie pamięcią obiektów, które tworzą i używają, choć oczywiście czasami nie można tego uniknąć - zawsze warto mieć przynajmniej przybliżone pojęcie o tym, jak działa garbage collection.

Jest kilka szczególnych kwestii, o których należy pamiętać. Strona dewelopera Apple ma niektóre wytyczne w tej sprawie. Dwa ważne stamtąd:

  • użyj instrukcji delete. Za każdym razem, gdy tworzysz obiekt przy użyciu nowej instrukcji, sparuj ją z instrukcją delete. Zapewnia to, że cała pamięć powiązana z obiektem, w tym jego nazwa właściwości, jest dostępna do zbierania śmieci. Instrukcja delete jest omówiona bardziej w "zwalnianie obiektów."
  • Użyj słowa kluczowego var. Każda zmienna utworzona bez słowa kluczowego var jest tworzona w globalnym zakresie i nigdy nie kwalifikuje się do zbiórki śmieci, stwarzając możliwość wycieku pamięci.

Wyobrażam sobie, że praktyki powinny mieć zastosowanie do wszystkich silników JavaScript( w różnych przeglądarkach), chociaż ponieważ jest to ze strony Apple, mogą być nieco specyficzne dla Safari. (Może ktoś mógłby to wyjaśnić?)

Mam nadzieję, że to pomoże.

 185
Author: Noldorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-01 14:30:18

Uważaj na odniesienia okrągłe, gdy obiekty DOM są zaangażowane:

Wzorce wycieku pamięci w JavaScript

Należy pamiętać, że pamięć może być odzyskana tylko wtedy, gdy nie ma aktywnych odniesień do obiektu. Jest to częsta pułapka w przypadku zamykania i obsługi zdarzeń, ponieważ niektóre silniki JS nie sprawdzają, które zmienne faktycznie są odwołane w funkcjach wewnętrznych i po prostu zachowują wszystkie zmienne lokalne funkcji zamykających.

Oto prosty przykład:

function init() {
    var bigString = new Array(1000).join('xxx');
    var foo = document.getElementById('foo');
    foo.onclick = function() {
        // this might create a closure over `bigString`,
        // even if `bigString` isn't referenced anywhere!
    };
}

Naiwna implementacja JS nie może zbierać bigString tak długo, jak jest w pobliżu Obsługa zdarzenia. Istnieje kilka sposobów rozwiązania tego problemu, np. ustawienie bigString = null na końcu init() (delete nie działa dla zmiennych lokalnych i argumentów funkcji: delete usuwa właściwości z obiektów, a obiekt zmiennej jest niedostępny - ES5 w trybie ścisłym wyrzuci nawet ReferenceError, jeśli spróbujesz usunąć zmienną lokalną!).

Polecam jak najbardziej unikać zbędnych zamknięć, jeśli dbasz o zużycie pamięci.
 52
Author: Christoph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 17:35:45

Dobry cytat zaczerpnięty z bloga

Komponent DOM jest "garbage collected" , podobnie jak komponent JScript, co oznacza, że jeśli utworzysz obiekt w jednym z komponentów, a następnie stracisz jego ślad, zostanie on ostatecznie oczyszczony.

Na przykład:

function makeABigObject() {
var bigArray = new Array(20000);
}

Podczas wywoływania tej funkcji, komponent JScript tworzy obiekt (o nazwie bigArray), który jest dostępny w ramach funkcji. Gdy tylko funkcja powróci, "tracisz kontrolę" nad bigArray bo nie ma już sposobu, by się do tego odwoływać. Cóż, komponent JScript zdaje sobie sprawę, że zgubiłeś jego ślad, więc bigArray został wyczyszczony--jego pamięć została odzyskana. To samo działa w komponencie DOM. Jeśli powiesz document.createElement('div') lub coś podobnego, komponent DOM utworzy dla Ciebie obiekt. Gdy w jakiś sposób stracisz śledzenie tego obiektu, komponent DOM oczyści powiązane z nim obiekty.

 15
Author: TStamper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 01:31:22

Zgodnie z moją najlepszą wiedzą, Obiekty JavaScript są śmieciami zbieranymi okresowo, gdy nie ma żadnych odniesień do obiektu. Jest to coś, co dzieje się automatycznie, ale jeśli chcesz zobaczyć więcej o tym, jak to działa, na poziomie C++, warto spojrzeć na WebKit lub V8 kod źródłowy

Zazwyczaj nie trzeba o tym myśleć, jednak w starszych przeglądarkach, takich jak IE 5.5 i wczesne wersje IE 6, a być może obecne wersje, zamknięcia tworzyłyby koliste odniesienia, które po niezaznaczeniu zjadałyby pamięć. W konkretnym przypadku, który mam na myśli o zamknięciach, było to, gdy DODANO odniesienie JavaScript do obiektu dom i obiekt do obiektu DOM, który odnosił się z powrotem do obiektu JavaScript. Zasadniczo nigdy nie można go było zebrać i ostatecznie spowodowałoby niestabilność systemu operacyjnego w aplikacjach testowych, które zapętlały się w celu tworzenia awarii. W praktyce te przecieki są zwykle małe, ale aby zachować czysty kod, musisz należy usunąć odniesienie JavaScript do obiektu DOM.

Zwykle dobrym pomysłem jest użycie słowa kluczowego delete, aby natychmiast odwołać się do dużych obiektów, takich jak dane JSON, które otrzymałeś i zrobić z nimi wszystko, co musisz zrobić, szczególnie w tworzeniu mobilnych stron internetowych. Powoduje to, że kolejne przesunięcie GC usunie ten obiekt i zwolni jego pamięć.

 13
Author: Heat Miser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 17:18:48

Garbage collection (GC) jest formą automatycznego zarządzania pamięcią poprzez usuwanie obiektów, które nie są już potrzebne.

Każdy proces z pamięcią wykonaj następujące kroki:

1-przydziel przestrzeń pamięci, której potrzebujesz

2-do some processing

3-wolne miejsce pamięci

Istnieją dwa główne algorytmy używane do wykrywania, które obiekty nie są już potrzebne.

Reference-counting garbage collection : algorytm ten redukuje definicję " an obiekt nie jest już potrzebny" aby "obiekt nie miał żadnego innego obiektu odwołującego się do niego", obiekt zostanie usunięty, jeśli nie ma punktu odniesienia do niego

Mark-and-sweep algorithm : Podłącz każdy obiekt do głównego źródła. żaden obiekt nie łączy się z rootem ani innym obiektem. ten obiekt zostanie usunięty.

Obecnie większość nowoczesnych przeglądarek korzystających z drugiego algorytmu.

 6
Author: Ahmed Gaber - Biga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-05 13:54:12

"w informatyce, garbage collection (GC) jest formą automatycznego zarządzania pamięcią. Garbage collector, lub po prostu collector, próbuje odzyskać śmieci lub pamięć używaną przez obiekty, które nigdy nie będą dostępne lub zmutowane przez aplikację."

Wszystkie silniki JavaScript mają swoje własne garbage collectory i mogą się różnić. Większość czasu nie trzeba sobie z nimi radzić, ponieważ po prostu robią to, co powinni zrobić.

Pisanie lepszego kodu głównie zależy jak dobrze znasz zasady programowania, język i konkretną implementację.

 4
Author: mtasic85,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 17:08:37

Co to jest JavaScript garbage collection?

Sprawdź to

Co jest ważne dla programisty internetowego, aby zrozumieć o JavaScript garbage collection, aby napisać lepszy kod?

W Javascript nie zależy ci na alokacji i dealokacji pamięci. Cały problem jest wymagany do interpretera Javascript. Przecieki są nadal możliwe w Javascript, ale są to błędy interpretera. Jeśli jesteś zainteresowany tym tematem możesz przeczytać więcej w www.memorymanagement.org

 1
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 17:06:29

W systemie windows możesz użyć Drip.exe aby znaleźć wycieki pamięci lub sprawdzić, czy Twoja wolna rutyna mem działa.

To naprawdę proste, wystarczy wpisać adres URL strony internetowej, a zobaczysz zużycie pamięci zintegrowanego renderera IE. Następnie naciśnij Odśwież, jeśli pamięć wzrośnie, znalazłeś wyciek pamięci gdzieś na stronie internetowej. Ale jest to również bardzo przydatne, aby sprawdzić, czy procedury uwalniania pamięci działają dla IE.

 1
Author: powtac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-05 23:01:41

Typy referencji nie przechowują obiektu bezpośrednio w zmiennej do które jest przypisane, więc zmienna obiektowa w tym przykładzie nie zawiera instancję obiektu. Zamiast tego posiada wskaźnik (lub odniesienie) do miejsce w pamięci, w którym obiekt istnieje

var object = new Object();

Jeśli przypisujesz jedną zmienną do drugiej, każda zmienna pobiera kopię wskaźnika, a oba nadal odwołują się do tego samego obiektu w pamięć.

var object1 = new Object();
var object2 = object1;

Dwie zmienne wskazujące na jeden obiekt

JavaScript jest językiem zbieranym ze śmieci, więc tak naprawdę nie musisz podczas korzystania z typów referencyjnych należy się martwić o alokację pamięci. Jednakże, najlepiej dereferencja obiekty, których już nie potrzebujesz, aby śmieci kolektor może zwolnić tę pamięć. Najlepszym sposobem na to jest ustawienie zmienna obiektu na null.

var object1 = new Object();
// do something
object1 = null; // dereference

Dereferencja obiektów jest szczególnie ważna w bardzo dużych aplikacjach, które wykorzystują miliony obiektów.

Z zasad Obiektowego JavaScript-NICHOLAS C. ZAKAS

 0
Author: Ani Naslyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-09 11:27:46