2012-09-22 8 views
14

Mam znaczne przerwy w zbieraniu śmieci. Chciałbym wskazać obiekty najbardziej odpowiedzialne za tę kolekcję, zanim spróbuję rozwiązać problem. Spojrzałem na migawkę sterty na Chrome, ale (popraw mnie, jeśli się mylę) Nie mogę znaleźć żadnego wskaźnika tego, co jest gromadzone, tylko to, co zajmuje najwięcej pamięci. Czy istnieje sposób, aby odpowiedzieć na to empirycznie, czy jestem ograniczony do wykształconych domysłów?Jak określić, jakie obiekty są zbierane przez moduł czyszczenia pamięci?

+2

Jak można mieć pewność, że przerwy są spowodowane przez zbieranie śmieci? – pencil

+0

Czy przeczytałeś to? http://gent.ilcore.com/2011/08/finding-memory-leaks.html?m=1 – HerrSerker

+1

@pencil Dwa sposoby - zbiegają się z upuszczeniem pamięci na osi czasu pamięci w Chrome i kiedy wymuszam kod do iteracji w celu ciągłego wywoływania pauz, zbiór śmieci jest (zdecydowanie) najbardziej czasochłonną częścią moich wyników profilowania. – shino

Odpowiedz

3

Jeśli próbujesz wybrać między kilkoma prawdopodobnymi sprawcami, możesz zmodyfikować definicję obiektu, aby dołączyć się do globalnego zasięgu (jako listę pod dokumentem lub coś podobnego). Wtedy to powstrzyma ich od zebrania. Co może sprawić, że program będzie szybszy (nie będzie odzyskiwany) lub wolniejszy (ponieważ będzie się on gromadził i będzie sprawdzany za każdym razem przy pomocy znacznika i znacznika). Jeśli zauważysz zmianę w wydajności, być może znalazłeś problem.

Jedną z opcji jest sprawdzenie, ile obiektów jest tworzonych dla każdego typu (ustawienie licznika w konstruktorze). Jeśli zbierają się dużo, są również tworzone tak samo często.

+0

To sprytnie! Zamierzam spróbować już teraz, dzięki. – shino

9

W profilach chrome wykonuje dwie sterty migawek, jedną przed wykonaniem czynności, którą chcesz sprawdzić, i jedną po.

Teraz kliknij drugą migawkę.

Na dolnym pasku pojawi się pole wyboru z opcją "podsumowanie". Zmień go na "porównanie".

Następnie w polu wyboru obok niego wybierz snaphot, z którym chcesz porównać (powinno automatycznie wybrać migawkę1).

Jako wyniki otrzymasz tabelę z danymi, których potrzebujesz, tj. Obiekty "nowe" i "usunięte".

5

z nowszymi Chrome uwalnia jest nowa dostępne narzędzie, które jest przydatne do tego rodzaju zadania:

„Rejestr Heap alokacji” profilowania typu. Zwykłe narzędzie porównawcze "Heap SnapShot" (jak wyjaśniono w odpowiedziach Rafała Łużyńskiego) nie może dostarczyć tego rodzaju informacji, ponieważ za każdym razem, gdy robisz migawkę sterty, wykonywany jest przebieg GC, więc obiekty GCed nigdy nie są częścią migawek. Jednak przy pomocy narzędzia "Przydział sterty rekordów" zapisywane są wszystkie alokacje (dlatego może spowolnić pracę znacznie podczas nagrywania). W przypadku częstych przebiegów GC to narzędzie może pomóc w zidentyfikowaniu miejsc w kodzie, w których przydzielana jest duża ilość pamięci. W połączeniu z porównaniem Snap Snap zobaczysz, że w większości przypadków dużo więcej pamięci jest przydzielane pomiędzy dwiema migawkami, niż można zobaczyć na podstawie porównania. W skrajnych przypadkach porównanie nie przyniesie żadnej różnicy, podczas gdy narzędzie alokacji pokaże wam mnóstwo przydzielonej pamięci (co oczywiście musiało być w międzyczasie zbiorem śmieci).

Niestety obecna wersja narzędzia nie pokazać gdzie przydział miało miejsce, ale pokaże co została przydzielona iw jaki sposób został zatrzymany w momencie przydziału. Z danych (i ewentualnie z konstruktorów) można jednak zidentyfikować obiekty, a tym samym miejsce, w którym są przydzielane.

3

Spójrz na https://developers.google.com/chrome-developer-tools/docs/heap-profiling

szczególnie Ograniczanie View

Widok Ograniczanie jest w istocie „lotu ptaka” z obiektów struktury danej aplikacji . Pozwala to zajrzeć do wewnątrz funkcji zamknięcia , aby obserwować obiekty wewnętrzne VM, które składają się na twoje obiekty JavaScript i zrozumieć, ile pamięci używa twoja aplikacja na bardzo niskim poziomie.

Widok zapewnia kilka punktów aktu:

DOMWindow obiektów - są to obiekty uznane za „globalne” obiekty dla kodu JavaScript; Korzenie GC - rzeczywiste korzenie GC używane przez śmieci VM kolektor; Obiekty natywne - obiekty przeglądarki, które są "wypychane" wewnątrz maszyny wirtualnej JavaScript w celu umożliwienia automatyzacji, np. węzłów DOM, CSS (patrz następny punkt więcej szczegółów.) Poniżej jest przykład tego, co widok Ograniczanie wygląda :

enter image description here

+0

O ile rozumiem, obiekty, które mogą być zbędne, nie pojawią się w tym widoku, ponieważ przed zrobieniem zdjęcia wykonywany jest przebieg GC. Ponieważ OP chce wiedzieć, jakie obiekty są GCedowane, to tak naprawdę nie pomoże, czy nie? – Sebastian

Powiązane problemy