2011-06-21 19 views
6

Instrumentami Dalvik VM i chciałbym wiedzieć, czy istnieją narzędzia do analizy zbierania śmieci w Dalvik. Wiem o śledzeniu alokacji, ale szukam czegoś bardziej wyszukanego.Narzędzie do zbierania śmieci dla dalvik

+0

Myślę, że DDMS pomoże. –

+0

Jaki problem próbujesz rozwiązać? –

+0

Mam uruchomioną usługę w tle na moim urządzeniu, która wykrywa ruch internetowy i działa jako serwer proxy dla innych aplikacji internetowych na urządzeniu. Mój problem polega na tym, że garbage collector zajmuje znacznie więcej czasu niż normalne wykonanie. Powoduje to zatrzymanie usługi w tle, co z kolei prowadzi do spowolnienia reakcji sieci na aplikację. Próbuję zajrzeć w to nagłe zachowanie śmieciarza. – 22kar

Odpowiedz

0

Wirtualny dziennik wszystkich operacji GC w czasie:

każdym razem GC odbywa, masz linię w swojej LogCat.

08-08 16:42:21.998: D/dalvikvm(26942): GC_CONCURRENT freed 773K, 26% free 4739K/6368K, paused 4ms+3ms, total 92ms 
08-08 16:42:21.998: D/dalvikvm(26942): WAIT_FOR_CONCURRENT_GC blocked 11ms 

Wygląda na to, że otrzymuję je dla wszystkich aplikacji na moim urządzeniu.

Ta linia zawiera wiele interesujących statystyk dotyczących GC, takich jak ilość pamięci zwolnionej, jak długo zajęło GC, kiedy dokładnie to się stało i rozmiar sterty (wykorzystany/całkowity).

Ponieważ wszystkie te linie dziennika mają znacznik dalvikvm, powinieneś być w stanie je zbierać i filtrować przez długi czas i analizować, aby poznać zachowanie GC.

Analizując konkretny przebieg GC:

Jeśli chcesz analizować to, co dzieje się w jednej konkretnej operacji GC, najlepszym narzędziem do tego zadania jest Eclipse MAT. Eclipse MAT może analizować zrzuty sterty. Zrób migawkę sterty, poczekaj na GC (lub uruchom ją sam, używając DDMS), a następnie wykonaj kolejną migawkę.

Eclipse MAT może pokazać różnicę między dwoma migawkami. Zauważ, że zobaczysz zarówno nowe alokacje, jak i zwolnienia spowodowane GC. Więcej informacji na temat porównywania migawek to available here.

Niektóre inne myśli:

Nie jestem pewien, ile byłbyś w stanie uczyć się od analizy procesu GC. Wewnętrzne funkcjonowanie GC jest szczegółem realizacji. Może zmienić się bez powiadomienia między wersjami/urządzeniami/konfiguracjami systemu operacyjnego.

Próbuję wymyślić sposoby na poprawę opóźnienia GC. Wydaje mi się, GC zwykle działa, gdy warunki pamięci są niskie. Prawdopodobnie dzieje się tak podczas nowych przydziałów, dlatego GC może być uruchomiony, gdy twoja usługa jest aktywna. Być może, jeśli użyjesz czasu, w którym twoja usługa jest nieaktywna dla GC ręcznie, będziesz w stanie zmniejszyć liczbę zdarzeń GC na krytycznej ścieżce odpowiedzi na żądanie sieci. Aby to wypróbować, dodałbym prosty licznik czasu i zresetował go, gdy moja usługa stanie się aktywna (nowe żądanie). Kiedy tykasz zegar (nieaktywność przez pewien okres czasu), uruchomię ręcznie System.gc().

Powiązane problemy