Techniki profilowania pamięci w Safari desktop i iOS?

Zaktualizowano 10/21: zmieniono tytuł i pytanie, aby ewentualnie uzyskać odpowiedź (inną niż"nie").

Mamy WYCIEKI W Safari (potwierdzone w Windows i Mac, podejrzewane w iOS). czy są jakieś rozszerzenia Safari, które pozwalają jednemu profilowi na wykorzystanie pamięci JavaScript / DOM, aby wykryć potencjalne wycieki? Jeszcze lepiej, czy jest jakieś narzędzie, które można używać na iOS lub w emulatorze Apple iOS? Jakie są sugerowane techniki odkrywania, co może być przyczyną wycieków pamięci w JavaScript / DOM W Safari? A czy ktoś zna jakiś sposób na dostęp do informacji o pamięci dla iOS?

Tło

Tworzymy aplikację internetową iOS Safari, która wykorzystuje paradygmat aplikacji jednostronicowej, ładując 100 obrazów pełnoekranowych. Ominęliśmy normalny limit obrazu 6.5 MB iOS Safari, resetując źródło znaczników obrazu, ale teraz mamy do czynienia z tym, co uważam za wyciek pamięci w iOS Safari. Po załadowaniu ~250-300 zdjęć iOS Safari po prostu zatrzymuje się ładowanie obrazów, z powodu tego, co podejrzewamy, to wyciek pamięci. Nic dziwnego, biorąc pod uwagę, że ten sam wyciek pojawia się zarówno w Safari Dla Windows, jak i Safari Dla Mac - w Windows jest to szczególnie złe; dla każdego nowego pełnoekranowego obrazu wysokiej rozdzielczości zużywane jest kolejne 10-15 MB pamięci, jeśli przełączymy się na obrazy o niższej rozdzielczości, to nadal pożera ~5 MB na obraz.

W Windows odizolowaliśmy wyciek do prostego aktu renderowania obrazu w widoku przeglądarki - mamy karuzelę obrazów, a nawet przy zerowej manipulacji DOM, po prostu tłumacząc (3d) Obraz przez viewport, pamięć jest przydzielana i nigdy nie zwalniana. W systemie Windows zużycie pamięci może szybko wzrosnąć do ~1,5 GB, w którym momencie Safari po prostu się zawiesza. Na Macu nie jest tak źle, ale pamięć łatwo skacze z 100 MB na początku do 500MB i więcej. Dla porównania, karta Chrome / proces hostujący tę samą stronę rośnie z około 33MB do ~120MB, a następnie stabilizuje się.

Próba Obejścia Sytuacji

We próbowaliśmy usunąć poszczególne znaczniki obrazu i zastąpić je obrazem zastępczym zamiast je zresetować, ale to nie wydaje się złagodzić problem, a także powoduje problemy z wydajnością, prawdopodobnie z powodu dom churn. Co ciekawe, usuwanie / odłączanie wszystkich obrazów działa - natychmiast po wykonaniu polecenia pamięć jest zwalniana. Jednak powoduje to własne problemy, zarządzanie stanem interfejsu użytkownika i tworzenie kopii zapasowej karuzeli również zajmuje zauważalną ilość czasu. Odświeżenie strony jest kolejnym obejściem, ale powoduje jeszcze więcej zakłóceń UX.

Aktualizacja 04/10: Tylko aktualizacja tego, co zrobiliśmy: iOS 4.2 wprowadził ograniczenie, które odcina przekształcony Div 3D na 122,900 pikseli. Nie wiem dlaczego, ale zmusiło nas to do ponownego zaprojektowania i zastosowania dynamicznej karuzeli zamiast poprzedniej statycznej taśmy filmowej.

Po drugie, okazało się, że używanie div z obrazami tła działa lepiej niż same obrazy. To wydaje się jeszcze kolejny błąd w Safari, a co najwyżej niespójna implementacja ograniczeń.

End update

myśli? jeśli napotkałeś podejrzane WYCIEKI W Safari, jakie było twoje podejście do obejścia ich?

Author: Oskar Austegard, 2010-10-19

1 answers

Po zainstalowaniu zestawu SDK iOS zainstalowane jest również narzędzie o nazwie Instruments. Może śledzić wszelkiego rodzaju statystyki użytkowania, w tym pamięć (istnieje nawet szablon "przecieków"). Wspaniałą rzeczą jest to, że może śledzić zarówno symulator iPhone ' a/iPada, jak i każde podłączone urządzenie programistyczne iOS. Oczywiście może być również używany do monitorowania zużycia pamięci w systemie Mac OS, więc może również pomóc w Safari. Narzędzia można znaleźć w /Developer / Applications.

Coś innego, co jest przydatne jest to, że gdy synchronizujesz iPad/iPhone z iTunes, synchronizuje również wszelkie raporty o awariach z urządzenia do komputera. Można je znaleźć w ~/Library/Logs/CrashReporter/MobileDevice/[Nazwa urządzenia]/.

Jedną z rzeczy, które odkryliśmy podczas tworzenia iPada, było to, że był bardzo podatny na awarie z powodu problemów z pamięcią, szczególnie w ciężkich aplikacjach, takich jak nasza. Nauczyliśmy się, że samo usunięcie elementu DOM nie oznacza, że element ten będzie śmieci zbierane przez przeglądarkę. Okazało się, że ustawienie obrazu src (lub tła-obrazu, jeśli był to div) na pusty łańcuch przed usunięciem go z DOM pomogło ogromnie.

Nie jestem pewien, czy coś z tego pomoże, ale mam nadzieję, że uruchomienie instrumentów da Ci lepsze wyobrażenie o tym, dokąd zmierza cała ta pamięć.

 37
Author: Brad Daily,
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
2010-10-22 03:29:47