Javascript i Garbage collection

Czy Jest jakiś sposób, aby kontrolować, kiedy Javascript wykonuje garbage collection? Chciałbym włączyć go do usuwania śmieci w określonych godzinach, aby zapewnić sprawne działanie mojej strony internetowej

Author: Ed Heal, 2013-09-14

6 answers

Javascript nie ma wyraźnego zarządzania pamięcią, to przeglądarka decyduje, kiedy ją wyczyścić. Czasami może się zdarzyć, że doświadczysz bezproblemowego renderowania JavaScript z powodu przerwy w usuwaniu śmieci.

Istnieje wiele technik, które można zastosować, aby przezwyciężyć usterki spowodowane przez garbage collection (GC). Więcej aplikacji więcej eksploracji. Załóżmy, że masz grę napisaną w JavaScript, a co sekundę tworzysz nowy obiekt, to oczywiste, że po pewna ilość czasu GC wystąpi, aby zrobić więcej miejsca dla Twojej aplikacji.

W przypadku aplikacji w czasie rzeczywistym, takich jak gry, które wymagają dużo miejsca najprostszą rzeczą, jaką możesz zrobić, jest ponowne użycie tej samej pamięci. To zależy od Ciebie, jak ustrukturyzujesz swój kod. Jeśli generuje dużo śmieci, to może dać niepewne doświadczenie.

Używając prostych procedur: dobrze jest wiedzieć, że nowe słowo kluczowe oznacza alokację. W miarę możliwości możesz spróbować ponownie użyć tego samego obiektu za każdym razem dodając lub modyfikując właściwości. Jest to również nazywane recyklingiem obiektu

W przypadku tablic, przypisanie [] jest często używane do wyczyszczenia tablicy, ale należy pamiętać, że tworzy ona również nową tablicę i usuwa starą. Aby ponownie użyć tego samego bloku należy użyć arr.length = 0, który ma ten sam efekt, ale wykorzystuje ten sam obiekt tablicy zamiast tworzyć nowy.

W przypadku funkcji : czasami nasz program musiał wywołać konkretna funkcja więcej czasu lub w określonych odstępach czasu za pomocą setInterval lub setTimeout.

ex: setTimeout(function() { doSomething() }, 10);

Możesz zoptymalizować powyższy kod, przypisując funkcję do stałej zmiennej, a nie za każdym razem w regularnych odstępach czasu.

    ex : var myfunc = function() { doSomething() }
    setTimeout(myfunc, 10);

Inną możliwą rzeczą jest to, że metoda array slice() zwraca nową tablicę (na podstawie zakresu w oryginalnej tablicy,który może pozostać nietknięty), string ' s substr również zwraca nowy łańcuch (na podstawie zakresu znaków w oryginalnej tablicy ciąg, który może pozostać nietknięty), i tak dalej. Wywołanie tych funkcji powoduje śmieci, jeśli nie jest prawidłowo wykorzystane.

Całkowite uniknięcie śmieci w JavaScript jest bardzo trudne, można powiedzieć niemożliwe. Jego zależy, jak ponownie używać obiektów i zmiennych, aby uniknąć śmieci. Jeśli twój kod jest dobrze ustrukturyzowany i zoptymalizowany, możesz zminimalizować koszty ogólne.

 72
Author: Shadow,
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-01-19 16:51:50

Niestety, nie ma sposobu, aby kontrolować, kiedy odbywa się wywóz śmieci, ale przy odpowiednim uformowaniu obiektów, można kontrolować, jak szybko i czysto to się dzieje. Spójrz na te dokumenty w Mozilla Dev Net.

Algorytm ten zakłada znajomość zbioru obiektów zwanych korzeniami (W JavaScript głównym obiektem jest obiekt globalny). Okresowo, garbage-collector zacznie od tych korzeni, znajdzie wszystkie obiekty, które są odniesione z tych korzeni, wówczas wszystkie obiekty odwołujące się od te itp. Począwszy od korzeni, garbage collector będzie więc Znajdź wszystkie dostępne obiekty i zbierz wszystkie niedostępne obiekty.

Algorytm ten jest lepszy od poprzedniego, ponieważ " obiekt ma zero reference " prowadzi do tego, że ten obiekt jest nieosiągalny. Na odwrót nie jest prawdą, jak widzieliśmy z cykli.

 5
Author: DevlshOne,
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
2013-09-14 09:51:49

Dlaczego nie zachować odniesień do wszystkich swoich obiektów, dopóki nie chcesz, aby były GC ' d?

var delayed_gc_objects = [];
function delayGC(obj) { // keeps reference alive
    return delayed_gc_objects[delayed_gc_objects.length] = obj;
}
function resumeGC() { // kills references, letting them be GCd
    delayed_gc_objects.length = 0;
}
 2
Author: Paul S.,
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
2013-09-14 10:04:22

Możesz wprowadzić pewne zmiany, aby poprawić wykorzystanie pamięci, takie jak:

  1. nie ustawiaj zmiennych na pętlach
  2. unikaj używania globalnych zmiennych i funkcji. będą zabierać kawałek pamięci, dopóki się nie wydostaniesz
 0
Author: Jean Carlos,
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
2013-09-23 01:43:39

JavaScript jest językiem zbieranym ze śmieci, co oznacza, że środowisko wykonawcze jest odpowiedzialne za zarządzanie pamięcią wymaganą podczas wykonywania kodu. Najpopularniejszą formą garbage collection dla JavaScript jest mark-and-sweep. Drugim, mniej popularnym rodzajem zbierania śmieci jest zliczanie referencji. Idea polega na tym, że każda wartość śledzi liczbę odniesień do niej

GC podąża za tymi algo, nawet jeśli uda Ci się uruchomić GC, nie będzie to gwarantowane że będzie działać natychmiast, tylko zaznaczasz to

 0
Author: anish,
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
2014-06-06 09:42:08

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ę " obiekt jest nie jest już potrzebny" aby "obiekt nie ma żadnego innego obiektu odwołującego się do niego", obiekt zostanie usunięty, jeśli nie ma punktu odniesienia do niego

Algorytm mark-and-sweep: Podłącz każdy obiekt do źródła głównego. ż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.

 -3
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:59:05