2016-10-12 15 views
8

Czy jest otwarte, dynamiczne tworzenie symboli ES6, które mogą powodować nieodwracalne zużycie pamięci?Czy gromadzone są symbole globalne ES6?

W języku Erlang (a także wcześniej, Ruby) tworzenie atomów/symboli nie jest zbiorem śmieci.

Wygląda na to, że symbole utworzone w globalnym rejestrze symboli (Symbol.for('string')) nie mogą zostać usunięte z pamięci i pozostać globalnie unikatowe, ale być może czegoś brakuje. Wydaje mi się, że nie jest to podyktowane specyfikacją ES6.

+0

Pytanie w Twoim tytule dotyczy wyłącznie tematu. Pytanie w twoim * tekście * jest jednak nie na temat (oparte na opiniach). –

+4

Symbole same w sobie są prymitywami. [The spec] (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-symbol.for) nie mówi nigdzie, że rekordy na liście * GlobalSymbolRegistry * klawisze i odpowiadające im symbole) są słabo trzymane. Więc zgaduję (stąd nie odpowiedź), że rekordy nie są GC. Ale musielibyście stworzyć *** wiele z nich, żeby to miało znaczenie. –

+2

Jak @ T.J.Crowder już napisał symbole w JS są prymitywami. Prymitywy nie są w pierwszej kolejności przedmiotem zbierania śmieci. Jedynym silnikiem może być usunięcie wpisu z listy. Tak czy inaczej to nie ma sensu. Jeśli umieścisz coś w rejestrze, silnik nie będzie mógł przewidzieć, czy spróbujesz go zdobyć w przyszłości. – zeroflagL

Odpowiedz

2

Symbole będące prymitywami nie oznaczają, że nie można ich zaimplementować za pomocą odniesień i alokacji. Po prostu pomyśl o prymitywnych ciągach w js. Przeglądarki mogą implementować symbole w ten sposób, czyniąc je przedmiotem gc. Szybki test for(;;) Symbol(); (nie uruchamiaj go) w chromie powoduje profil pamięci zęba, więc zakładam, że symbole są przydzielane, a śmieci zbierane.

+1

'for (;;) Symbol();' nie testuje symboli globalnych, testuje tylko te o zasięgu lokalnym. Aby sprawdzić, czy występuje wyciek z globalnym symbolem db, użyj: '(funkcja f() { niech first_char = String.fromCharCode (0); niech s = first_char; let Next = s = _1 => s.charCodeAt (0) ! == 65535? String.fromCharCode (s.charCodeAt (0) +1) + s.substring (1): first_char + s; dla (let x = 1; x <= 200000; ++ x) Symbol.for (s), s = NextString (s); console.log ("wykonane okrążenie następnie w 5 s"); setTimeout (f, 5000); })() '. Uważam, że Chrome nie testuje, czy używane symbole znajdują się w zasięgu, innymi słowy, Chrome podlega wyciekowi pamięci. – Pacerier

+0

Po pierwsze upewnij się, że to potwierdzenie jest w porządku: '{let r = 65536 + Math.floor (Math.random() * (Number.MAX_SAFE_INTEGER + 1-65536 + 1)); console.assert (String.fromCharCode (r) === String.fromCharCode (r% 65536))} ' – Pacerier

+0

Btw jakiego narzędzia używasz do profilowania? – Pacerier

Powiązane problemy