2011-08-26 7 views
6

Chcę filtrować, które klasy są profilowane przez cpu w Javie VisualVm (wersja 1.7.0 b110325). W tym celu próbowałem pod Profiler -> Ustawienia -> CPU-Settings, aby ustawić "Tylko profil klasy" do mojego testowanego pakietu, który nie przyniósł żadnego efektu. Następnie próbowałem pozbyć się wszystkich klas java. * I sun. *, Ustawiając je w "Nie profiluj klas", co również nie miało żadnego efektu.Czy klasy filtrowania dla profilowania cpu działają w języku Java VisualVM?

Czy to po prostu błąd? Czy może czegoś brakuje? Czy jest w pobliżu praca? Mam na myśli inne niż:

Chcę to zrobić głównie w celu uzyskania połowy poprawnych procentów zużytego procesora na metodę. W tym celu muszę pozbyć się irytujących pomiarów, np. dla sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() (około 70%). Wielu użytkowników ma ten problem, patrz np.

+0

Czy Twoim celem jest, aby kod działał tak szybko, jak to możliwe? lub po prostu uzyskać pewne procenty, niezależnie od tego, co mają na myśli? "Czas", jak jest powszechnie używany, jest wysoce niejednoznaczny. –

+0

Tak, moim głównym celem jest przyspieszenie działania kodu. Chciałbym również oszacować, jak duża część kodu powinna ulec zmianie. Dlatego chcę uzyskać ogólny przegląd wszystkich gorących punktów i ich nasilenia. Myślę, że wyniki VisualVm byłyby do zaakceptowania w tym przypadku, pomimo używania czasu ściany - gdyby tylko te nieliczne klasy sun. * I java. * Nie zepsuły wszystkich statystyk. – DaveFar

Odpowiedz

10

W profilu widzisz sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(), ponieważ została wybrana opcja Profil nowy Runnables. Ponadto, jeśli zrobiłeś migawkę sesji profilowania, możesz zobaczyć cały moduł wywoławczy dla dowolnej metody hotspot - w ten sposób możesz przejść od metody run() do własnych metod logiki aplikacji, odfiltrowując szumy wygenerowany przez opcję Nowy profil Runnables.

+0

Dzięki JB (+5), sprawdzę tę opcję w poniedziałek - brzmi jak rozwiązanie :) Zrobiłem migawkę, która dała mi widok drzewa wywołań, co nie jest dobre, ponieważ tylko widok Profiler daje mi procenty zużyte CPU na metodę. Ze względu na rekurencję, mój callstack jest zbyt skomplikowany, aby uzyskać od niego rozsądne informacje o wydajności. – DaveFar

+0

Dzięki JB wyłączenie opcji "Profile new Runnables" załatwiło sprawę. – DaveFar

+2

Należy pamiętać o konsekwencjach wyłączenia wyżej wymienionej opcji. Po włączeniu opcji otrzymasz automatycznie informacje o wszystkich nowo uruchomionych wątkach/runnables. Po wyłączeniu tej opcji musisz podać wyczerpującą listę metod root. –

0

OK, ponieważ Twoim celem jest, aby kod działał tak szybko, jak to możliwe, pozwól mi zasugerować, jak to zrobić. Nie jestem ekspertem od VisualVM, ale mogę powiedzieć, co działa. (Tylko kilku programistów faktycznie mówi ci, co musisz wiedzieć, to jest - które linie twojego kodu są na stosie zdrowym ułamkiem czasu zegara ściennego.)

Jedyny pomiar, z jakim kiedykolwiek sobie poradzę, to stoper na czas ogólny lub, alternatywnie, jeśli kod ma wartość podobną do liczby klatek na sekundę, liczba klatek na sekundę. Nie potrzebuję żadnego dalszego podziału precyzji, ponieważ jest to w najlepszym razie odległa wskazówka co do marnowania czasu (i częściej zupełnie nieistotnego), kiedy istnieje bardzo bezpośredni sposób na zlokalizowanie go.

Jeśli nie chcesz wykonywać random-pausing, to zależy od Ciebie, ale udowodniono, że działa, i here's an example of a 43x speedup.

Zasadniczo chodzi o to, że otrzymujesz (małą, jak 10) liczbę próbek stosu, wykonanych losowo w czasie zegarowym. Każda próbka składa się (oczywiście) z listy stron z telefonami i prawdopodobnie strony bez połączenia na końcu. (Jeśli próbka jest w trakcie operacji we/wy lub uśpienia, zakończy się ona wywołaniem systemowym, co jest w porządku.To właśnie chcesz wiedzieć.)

Jeśli istnieje sposób na przyspieszenie kodu (i prawie na pewno jest), zobaczysz go jako linię kodu, która pojawia się na co najmniej jednej z próbek stosu. Prawdopodobieństwo, że pojawi się na jednej próbce jest dokładnie takie samo, jak ułamek czasu, którego używa. Więc jeśli istnieje strona połączenia lub inna linia kodu korzystająca z zdrowej części czasu, a unikniesz jej wykonania, całkowity czas zmniejszy się o tę część.

Nie znam wszystkich profilerów, ale ten, który znam, może ci powiedzieć, że jest to Zoom. Inni mogą to zrobić. Mogą być bardziej oszałamiające, ale nie działają szybciej ani lepiej niż metoda ręczna, gdy celem jest maksymalizacja wydajności.

+0

Należy pamiętać, że w JVM może się zdarzyć, że metoda nigdy nie pojawi się na wykresie stosu, nawet jeśli jest wykonywana dość często. Powodem tego jest sposób, w jaki maszyna JVM pozwala na rejestrowanie stosu - ślad stosu wątku może być wzięty tylko w punkcie kontrolnym, który nie może być wstawiony przez JIT do każdej metody. –

+0

Jesteś "przypadkowym pauzującym ewangelistą", Mike :) W każdym razie, za odpowiedź, przegłosowałbym go, gdybym nie podał linku do ciebie, opisującego już tę technikę. Próbowałem, ale z powodu rekursji, callstack jest dość skomplikowany. Widok profilu dzieli go na metody z procentem środowiska wykonawczego, dzięki czemu punkty aktywne są znacznie łatwiejsze do zobaczenia. Po drugie, widok profilu pokazuje wszystkie gorące punkty i ich nasilenie. Daje to dobry przegląd tego, co i jak należy dokonać strojenia. Czy sie zgadzasz? – DaveFar

+0

@DaveBall: Nie chodzi o hotspoty i pomiary. Tak, stos wywołań jest złożony i istnieje rekurencja. Mimo to sprawdź, czy możesz zaznaczyć to wszystko i skopiować do edytora. Następnie przestudiuj i sprawdź, czy potrafisz odpowiedzieć na proste pytanie: "Co to jest w procesie robienia tego w tym czasie i dlaczego to robi?" Następnie zrób to jeszcze raz kilka razy. Dzięki temu dowiesz się, dlaczego spędzasz czas, i pokaże ci, na czym powinieneś się skoncentrować. Nie daj się zastraszyć rekurencją lub złożonym stosem. Każda linia kodu widoczna na 2 próbkach na 3 kosztuje przeciętnie (2 + 1)/(3 + 2) = 60%. Dobre polowanie. –

Powiązane problemy