Wyciek pamięci (jQuery), jedna zakładka zajmuje 1GB pamięci w chrome |
Wyciek pamięci (jQuery), jedna zakładka zajmuje 1GB pamięci w chrome |
2.05.2013, 13:04:06
Post
#1
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 8.07.2012 Ostrzeżenie: (0%) |
Hej
Mam problem z jquery , napisałem kilka animacji , wszystko ładnie działa lecz po pewnym czasie (jakieś 10min) drastycznie zwiększa się użycie pamięci które dochodzi do 1GB na 1 zakładke w Chrome. Domyślam się że animacja jest źle zloopowana ale wydaję mi sie że jest OK. Próbowałem kilku różnych rzeczy http://wytestuj.cba.pl/tyla/send.php Chodzi mi o tą animacje konkretnie (na reszcie strony jest inna więc nie zmieniajcie zakładki)
|
|
|
2.05.2013, 14:00:27
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) |
po pewnym czasie masz wieeele razy odpaloną funkcję animuj i cyklicznie w postępie lawinowym podpinany setInterval(animuj,40000) - w tym miejscu co jest wystarczył by setTimeOut... lub troszkę inaczej to zapisać...
ps. nie potrzebnie wiele razy podpinasz .hover... prędzej byś skożystał z .delegate (coś jak .live) ps2. skoro elementy #loga i #menu sa w drzewie DOM po .ready to mógłbyś te elementy wyszukać i zapamiętać w jakiejś zmiennej by ich nie szukać stale po selektorach CSS ps3. jeśli elementy #menu nie zmieniają sie dynamicznie to wystarczyło by raz podpiąć .hover... Ten post edytował zegarek84 2.05.2013, 14:01:37 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
2.05.2013, 15:50:42
Post
#3
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 8.07.2012 Ostrzeżenie: (0%) |
Tzn .hover mam podpięte dokładnie 1 raz , chodzi ci o to żeby znajdował sie poza funkcją animuj , tak ?
Co do tych selektorów , to zapisać je przed .ready() czy w środku ? Bo wydaje mi się że mimo wszystko one i tak będą sie wyszukiwać na nowo Zaraz spróbuję z tym setTimeOut i dam znać Dzięki za nakierowanie |
|
|
2.05.2013, 16:32:06
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) |
To co Ty napisałeś już poprawniej powinno działać przy takim zapisie (minimalna modyfikacja tylko więc HOVER będzie przypisywany dodatkowo przy każdej animacji - tu też będzie minimalny wyciek pamięci ale większość by go pominęła...)
skoro hover wystarczy raz przypisać więc dla zobrazowania z zapamiętanym elementem do animacji kod można by zapisać w ten sposób (urzyta tutaj 1 zmienna globalna - można to inaczej zapisać...)
bez zmiennej globalnej można by np. w ten sposób - sposobów jest wiele i nie chcę narzucać rzadnego stylu, urzyta jest tutaj tylko dodatkowa anonimowa funkcja
w tamtym miejscu gdzie wcześniej miałeś setInterwal prędzej pasowała funkcja setTimeout... ps. nie wiem czy p.active zmienia się dynamicznie czy nie więc nie buforowałem tych selektorów... ale jeszcze jeśli gdzieś zmieniasz klasę .active to można by zbuforować jakiś element nadrzędny nie zmieniający się z jakimś np. id i w jQuery skożystać z kontekstów, więc nie szukać tych elementów p.active w całym dokumencie HTML tylko podać kontekst - ale to już takie zagadnienia optymalizacyjne... Ten post edytował zegarek84 2.05.2013, 16:41:41 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
2.05.2013, 18:00:10
Post
#5
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 8.07.2012 Ostrzeżenie: (0%) |
Poczytałem troche o setInterval i setTimeout i zastosowałem sie do twoich rad.
Sama zamiana z setInterval na setTimeout rozwiązała problem i teraz strona sie nie zawiesza i nie pobiera 1GB pamięci , lecz nadal bierze ~140MB co jest dużą liczbą Myśle że drugie rozwiązanie które mi podesłałeś będzie OK, jak przerobie to napisze co i jak. Dzięki ! PS. W drugim rozwiązaniu jest var jLoga; Czemu odrazu nie ustawiłeś wartości jLoga = $("#loga") ? Ten post edytował kamloo21 2.05.2013, 18:02:51 |
|
|
2.05.2013, 21:37:59
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) |
PS. W drugim rozwiązaniu jest var jLoga; Czemu odrazu nie ustawiłeś wartości jLoga = $("#loga") ? tylko to zależy, kiedy zaczyna się o tym myśleć ;p - a to dosyć ważne, gdyż jest to dostępne dopiero po documentready ;p, czyli jak cały DOM załadowany, po to z tej metody kożystałeś... ;p... trochę inaczej zapisane a to samo znaczące ;p - po prostu wcześniej tego elementu anie znajdziesz...
-------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
2.05.2013, 23:03:26
Post
#7
|
|
Grupa: Zarejestrowani Postów: 717 Pomógł: 120 Dołączył: 18.04.2009 Ostrzeżenie: (0%) |
1. w Google Chrome jest profiler (z którego się dopiero uczę korzystać, w zasadzie dzięki temu wątkowi, zmotywowałem się i zacząłem się bawić (Ctrl + Shift + J, wybierz zakładkę Profiles, dalej "Take Heap Snapshot"). Może coś odkryjesz.
2. zainteresowałbym się animacjami CSS3 (@keyframes etc.) zamiast jQuery.animate (nie wiem czy to rozwiąże twój problem z pamięcią, bo problem może być gdzie indziej, ale spróbowac można) Ten post edytował PrinceOfPersia 2.05.2013, 23:04:41 -------------------- |
|
|
3.05.2013, 09:09:31
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) |
podejrzałem dzisiaj kod na Twojej stronie i widzę, że zrobiłeś "misz masz..." - zwróć uwagę, że nie buforujesz wyszukiwanych elementów choć je przypisujesz do zmiennej gdyż masz przypisane do zmiennej wewnątrz funkcji... masz teraz 2 funkcje animuj o.O - oczywiście wywoływana jest ta z bliższym scope...
-------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
3.05.2013, 11:24:14
Post
#9
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 8.07.2012 Ostrzeżenie: (0%) |
Na strone wrzuciłem twoja wersje a moja wersja jest w komentarzu , wczoraj potestowałem to wszystko i teraz pobór pamięci utrzymuje się w granicach 26MB nawet po kilku godzinach więc udało się Dzięki.
Jeszcze troche popracuje nad tym i będzie miodzio @edit W Chromie jest lepsza opcja , jak wejdziesz w Timeline kliknij na dole Record i masz cały wykres zużycia pamięci , FPSów itd Ten post edytował kamloo21 3.05.2013, 11:51:16 |
|
|
Wersja Lo-Fi | Aktualny czas: 18.04.2024 - 03:50 |