2012-07-01 20 views
8

Znalazłem to na wszystkich testowanych przeglądarkach - IE, Firefox, Chrome i Safari w oknie Sand Safari na Apple.Odświeżenie przeglądarki nie powoduje zbierania śmieci

Podobno przycisk odświeżania przeglądarki, przycisk Wstecz lub łącze przesyłania do przodu powinny zrzucać węzły przeglądarki i zmienne javascript oraz obiekty itp. Wygląda na to, że nie ma to miejsca w przypadku WebGL. Po raz pierwszy zauważyłem to podczas opracowywania złożonej aplikacji WebGL, która wymaga od 100 MB do 200 MB pamięci. Podczas rozwoju muszę dużo odświeżyć i mój komputer zacznie zwalniać i zamarzać po 5-10 odświeżeniach.

Po kilku badaniach zdałem sobie sprawę, że tak nie powinno być. Przyjmowanym rozwiązaniem problemu z wyciekiem pamięci jest odświeżenie strony, na której należy zwolnić wszystkie obiekty i zmienne javascript oraz węzły domena. Ale spójrz na następujące obrazy:

Więc o co tu chodzi? W przypadku małych aplikacji nie jest to zauważane, ale w przypadku dużych aplikacji WebGL, takich jak moja (orbitingeden.com), jest to poważny problem, a moi użytkownicy sądzą, że oprogramowanie jest jeszcze bardziej szkodliwe dla środowiska niż w rzeczywistości. Poniższy rysunek przedstawia te odświeża wydziobujących wszystkie moje dostępnej pamięci, więc zbieranie śmieci nie działa i/lub JS i DOM obiekty nie są zwolnione:

http://orbitingeden.com/images/big_memory_after.png

Czy ktoś wie o trick zmusić przeglądarka, aby zrobić prawdziwy zrzut pamięci? Dlaczego cała dokumentacja jest błędna?

+2

https://bugs.webkit.org/show_bug.cgi?id=76225 – gman

+0

@gman: jeśli odpowiesz na pytanie, dam ci kredyt. Streszczenie: WebGL używa kontekstu, który jest chroniony przez domenę i kartę, nieistotną dla konkretnej strony (odświeżanie). W rezultacie dowolna pamięć przydzielona do renderowania WebGL nie jest zwalniana w celu usunięcia pamięci, dopóki użytkownik nie odejdzie od domeny podstawowej lub nie zamknie karty. Ewentualną poprawką byłoby dodanie przycisku wyjścia do aplikacji, która wykonuje szybkie przekierowanie do nowej domeny, która przekierowuje z powrotem. –

+0

Błąd zostanie naprawiony każdego dnia teraz, więc mam nadzieję, że wkrótce nie będzie potrzeby obejścia. W teście zgodności z webgl jest test na to (https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/conformance/context/context-creation-and-destruction. html) – gman

Odpowiedz

2

Jednym z punktów zbierania śmieci jest to, że obiekty są , a nie oczyszczone natychmiastowo, gdy nie są używane. Śmieciarz może sam zdecydować, kiedy najlepiej wykonywać kolekcje.

To normalne, że w systemie gromadzenia śmieci tp pozostawiają pewne nieużywane obiekty w stercie, o ile jest dużo pamięci do użycia. Komputer nie działa szybciej niż ma dużo niewykorzystanej pamięci.

+0

To ma być prawdą podczas sesji strony. Jednak zasada jest taka, że ​​odświeżanie strony powinno wykonać następujące czynności: usunąć wszystkie węzły, osierocić wszystkie zmienne, a następnie wymusić zbieranie śmieci, które powinno zebrać wszystkie te ostatnio porzucone obiekty i zmienne oraz usunąć je z pamięci. Niezależnie od tego, zgodnie z twoją teorią, kiedy komputerowi kończy się pamięć, zbieranie śmieci powinno zebrać wszystkie te nieużywane obiekty i zutylizować je. Ale mój komputer zamiast tego zatrzymuje się! –

+0

@OrbitowanieEden: jeśli pamięć nie jest zbierana w razie potrzeby, najprawdopodobniej jest to prawdziwy wyciek pamięci. Śmieciarz powinien wskoczyć, gdy masz mało. – Guffa

+2

Następnie myślę, że pytanie jest lepiej umieścić: Jak wyciek pamięci javascript przenikają na stronie odświeżania i nawigacji? To niemożliwe, prawda? –