2010-04-14 22 views
6

Właśnie uruchomiłem ponownie przeglądarkę Firefox, ponieważ zaczęło się jąkać i zwalniać. Dzieje się to co drugi dzień z powodu (moim zrozumieniem) nadmiernego wykorzystania pamięci. Zauważyłem, że trwa to 40 M, kiedy się zaczyna, a następnie, gdy zauważę spowolnienie, przechodzi do 1G i moja maszyna nie ma nic więcej do zaoferowania, chyba że zamknę inne aplikacje. Próbuję zrozumieć techniczne powody, dla których jest to tak trudny problem dla Sol ve.Wysokie wykorzystanie pamięci dla manekinów

Mozilla mieć stronę o wysokim wykorzystaniu pamięci:

http://support.mozilla.com/en-US/kb/High+memory+usage

Ale szukam nieco bardziej w głębi i satysfakcjonującego wyjaśnienia. Nie super techniczne, ale wystarczające, aby dać temu zagadnieniu więcej szacunku i zadowolić tłum.

kilka pytań mam już rozpatrzone (mogą być głupie więc wziąć to łatwe):

  • Kiedy zamknąć wszystkie karty, dlaczego nie użycie pamięci przejść całą drogę w dół?
  • Dlaczego nie ma ograniczeń użycia pamięci rozszerzeń/motywów/wtyczek?
  • Dlaczego zużycie pamięci rośnie, jeśli jest otwarte przez dłuższy czas?
  • Dlaczego wycieki pamięci są tak trudne do znalezienia i naprawienia?

Również odpowiedzi na pytania dotyczące aplikacji i języka są bardzo doceniane.

+0

to pytanie jest trochę za szerokie. Firefox cierpi na wycieki pamięci, najlepiej jest przeczytać ten temat. Zamykanie kart niekoniecznie zwalnia pamięć przydzieloną dla tej karty. –

+1

i twoje pytanie programistyczne jest? – KevinDTimm

+1

@KevinDTimm to ostatnia kula na liście – David

Odpowiedz

10

Przeglądarki są jak ludzie - oni się starzeją, dostają duże, a oni się porzuciła dla młodszych i lżejszych modeli.

Firefox to nie tylko przeglądarka, to ekosystem. Chociaż wydaje mi się, że ostatnie wersje są dość rozdęte, podstawowy produkt jest ogólnie stabilny.

Jednak firefox to ekosystem/platforma:

1) źle napisany wtyczek

2) źle napisany kod JavaScript, który realizuje się w niej.

3) Adobe Flash jako platforma do filmów o dużej wadze i dla źle napisanych skryptów reklamowych, takich jak "hit Osama bin Laden z kaczką, aby obniżyć stopę kredytu hipotecznego i otrzymać darmowy iPod * (wymagany udział).

4) QuickTime i inny odtwarzacz multimedialny.

5) Niektóre wbudowane kody Java.

Opis wycieku pamięci sugeruje skrypt z amokiem lub narzędzie innej firmy żądające większej ilości pamięci. Jeśli kiedykolwiek uruchomisz Flash na komputerze Mac, to prawie podana wraz z 90% wykorzystania procesora.

Celem większości języków programowania nie jest oszczędzanie, ale dostarczenie narzędzi do oszczędzania. Możesz napisać niepoprawny i nadęty kod z wyciekami pamięci w dowolnym języku, w tym z wyrzucaniem elementów bezużytecznych.Narzędzia innych firm zwykle nie są tak dobrze testowane, jak sama platforma. Strony internetowe, które próbują robić zbyt wiele, również nie są rzadkie.

Jeśli chcesz zrobić eksperyment, aby to zademonstrować, zdobądź Maca w Firefoksie i przejdź do dobrze napisanej strony, takiej jak Stack Overflow, i spędź godzinę. Twoje zużycie pamięci nie powinno rosnąć zbyt wiele. Następnie spędź 5 minut na losowych stronach Myspace.

Teraz pozwól mi spróbować odpowiedzieć na Twoje pytania na podstawie moich domysłów, ponieważ nie jestem zaznajomiony z kodem źródłowym

  • Kiedy zamknąć wszystkie karty, dlaczego nie zużycie pamięci przejść całą drogę w dół do ?

Zważywszy każdej instancji przeglądarki to niezależny proces z własnej pamięci, karty w jednym oknie znajdują się w tym samym procesie. Firefox miał kiedyś buforowanie w pamięci, a samo zamknięcie karty nie powoduje natychmiastowego usunięcia odpowiednich informacji z pamięci podręcznej w pamięci. Jeśli ponownie otworzysz kartę w tej samej witrynie, możesz uzyskać lepszą wydajność. Była pewna zaawansowana opcja pozwalająca ci ją wyłączyć, coś jak browser.cache.memory.enable. Lub po prostu wyszukaj wyłączenie pamięci podręcznej.

* Why is there no limits on extensions/themes/plugins memory usage? 

Z tego samego powodu, dla którego system Windows lub Linux nie ma procesu sprawdzania aplikacji, które można na nich uruchomić. To otwarte środowisko i ryzykujesz. Jeśli chcesz środowisko, w którym aplikacje i rozszerzenia są „zatwierdzone”, Apple może być droga :)

* Why does the memory usage increase if it's left open for long periods of time? 

Nie wszystkie obliczenia i działania w skrypcie mieć przejawy wizualne. Scenariusz może robić pewne rzeczy w tle (jak żądanie dodatkowych materiałów, wstępne pobieranie rzeczy, tylko błędy), nawet jeśli go nie widzisz.

* Why are memory leaks so difficult to find and fix? 

Chodzi o księgowość. Pomyśl o każdej rzeczy, którą kiedykolwiek wypożyczyłeś (nawet długopis) lub o tym, że ktoś pożyczał od ciebie w ciągu całego twojego życia. Czy wszystkie są rozliczane? Wycieki pamięci są w ten sam sposób (pożyczysz pamięć z systemu), z wyjątkiem tego, że przekazujesz przedmioty dookoła. A potem spójrz na rzeczy na biurku, czy zostawiłeś coś w pobliżu, bo "może będziesz tego potrzebować wkrótce", chociaż prawdopodobnie nie będziesz? ta sama historia.

+4

Przyjemna analogia księgowości. –

+0

@Warren: Dziękujemy! – Uri

+0

I jestem na komputerze ... – zaf

2
  • Dlaczego są wycieki pamięci tak trudno znaleźć i naprawić?

Ponieważ niektórzy deweloperzy odmawiają używania narzędzi, takich jak Elektryczny płot.

+0

Deweloperzy Firefoksa używają Valgrind - który jest znacznie bardziej zdolny niż Electric Fence. – slacker

+0

Dobre dla nich. Mam dobre wspomnienia z używania Valgrind do polowania na problemy z pamięcią. (Niestety, mój kod miał wtedy poważne problemy, więc ogólne doświadczenie było bolesne, ale to nie była wina Valgrind ...) –

1

Przecieki pamięci są obecne przede wszystkim dlatego, że chcesz zachować wszystko w pamięci, a nie na dysku. Załóżmy na przykład, że masz stronę internetową zawierającą obrazy, CSS, JavaSript, tekst. Jeśli chcesz wyświetlić stronę, przejdziesz na dysk twardy za każdym razem, gdy chcesz użyć interpretera JavaScript lub parsera CSS lub silnika renderującego czcionki do wyświetlenia tekstu, wtedy przeglądarka będzie bardzo powolna, a czasami nie będzie działać w ogóle (ponieważ jeden fragment kodu JavaScript może potrzebować zmiennych, które są na przykład pozostawione przez inny fragment kodu JavaScript). Dlatego przeglądarka stara się zachować wszystkie rzeczy niezbędne do jej pracy w pamięci, a te rzeczy łatwo się odwołują (wywoływanie JavaScriptu w Adobe Flash, wywoływanie Adobe Flash w JavaScript itd.).I musisz być bardzo ostrożny z takimi odniesieniami do zasobów, ponieważ czyszczenie ich przedwcześnie i niecałkowicie złamie kod (lepiej zachować zasób, a następnie umrzeć nagle, ponieważ go tam nie ma).

P.S. Zobacz także this article, aby uzyskać szczegółowe informacje.

Powiązane problemy