Problem polega na tym, że sampler VisualVM pokazuje drzewo wywołań według czasu. Dla niektórych metod sampler pokazuje tylko "Self time", więc nie widzę, co sprawia, że ta metoda jest wolna. Here is an example.
Jak mogę zwiększyć głębokość profilowania?Dlaczego program VisualVM Sampler nie udostępnia pełnych informacji o obciążeniu procesora (wykonanie metody czasu)?
Odpowiedz
Nie ma nic złego w tym przykładzie. Wygląda na to, że updateInfoInDirection()
dzwoni dzwoni dzwoni dzwoni"Czas samotności" oznacza, że czas spędzany jest w kodzie samych metod (metoda updateInfoInDirection()
znajduje się na dnie stosu w momencie pobrania próbki nici).
Niestety próbek profilowania są raczej ograniczone, gdy przychodzi do dogłębnej profili ze względu na szereg przyczyn:
Próbniki są ograniczone przez okres próbkowania: Na przykład VisualVM obecnie ma minimalny okres próbkowania 20 ms. Współcześni przetwórcy mogą wykonywać w tym czasie kilka milionów instrukcji - z pewnością więcej niż wystarczająco, by wywołać kilka krótkich metod i powrócić z nich.
Podczas gdy oczywistym rozwiązaniem byłoby zmniejszenie okresu próbkowania, zwiększyłoby to również wpływ profilera na aplikację, przedstawiając ładny przykład uncertainty principle.
Próbniki są łatwo pomylić kodem inline: Zarówno JVM i każdy przyzwoity kompilator inline trywialne i/lub często zwanych metod, a tym samym włączenie ich kodu w kodzie swojego rozmówcy. Samplatory próbkowania nie mają możliwości określenia, które części każdej metody faktycznie należą do niej i które należą do połączeń śródliniowych.
W przypadku VisualVM czasie Jaźni faktycznie obejmuje czas realizacji zarówno metody i dowolnego kodu wplatany.
Próbniki mogą zostać zdezorientowane przez zaawansowaną maszynę wirtualną: Na przykład w nowoczesnych metodach implementacji JVM metody nie mają stabilnej reprezentacji. Wyobraźmy sobie na przykład w następujący sposób:
void A() { ... B(); ... }
Kiedy JVM zaczyna
B()
jest interpretowany prosto z kodu bajtowego, biorąc w ten sposób sporo czasu, co sprawia, że widoczne na próbniku. Następnie, po chwili JVM decyduje, żeB()
jest dobrym kandydatem do optymalizacji i kompiluje go do natywnego kodu, dzięki czemu jest znacznie szybszy. I po jeszcze innej chwili JVM może zdecydować o zainicjowaniu połączenia pod numeremB()
, dołączając jego kod doA()
.W najlepszym przypadku profiler pobierania próbek pokaże koszt tych pierwszych serii, a następnie koszt kolejnych serii zostanie uwzględniony w czasie spędzonym przez dzwoniącego. To niestety może wprowadzić w błąd niedoświadczonego programistę w niedoszacowanie kosztu metody, która została zainicjowana.
W najgorszym wypadku koszt ten może zostać przypisany do połączenia rodzeństwa, a nie do dzwoniącego. Na przykład aktualnie profiluję aplikację za pomocą VisualVM, gdzie hotspot wydaje się być, aby być metodą
ArrayList.size()
. W mojej implementacji Java ta metoda jest prostym narzędziem pobierającym pole, które każda maszyna JVM powinna szybko wstawiać.Jednak program profilujący pokazuje, że jest to główny konsument czasu, całkowicie ignorując kilka pobliskich połączeń telefonicznych, które są oczywiście znacznie droższe.
Jedynym sposobem na uniknięcie tych słabości jest użycie profilera narzędziowego, a nie próbkowania. Narzędzia do profilowania, takie jak profil dostarczony przez zakładkę Profilerw VisualVM, zasadniczo zapisują każde wejście i wyjście metody w wybranym kodzie. Niestety, instrumentacji profilery mieć dość duży wpływ na profilowanej kodu:
one wprowadzić swój kod monitoringu wokół każdej metody, która całkowicie zmienia sposób, w jaki sposób jest traktowany przez JVM. Nawet proste metody pobierania/ustawiania pól mogą nie być już zaindeksowane dzięki dodatkowemu kodowi, a więc przekrzywiać wyniki. Profiler zazwyczaj stara się uwzględnić te zmiany, ale nie zawsze się to udaje.
Powodują one znaczące spowolnienia w stosunku do profilowanego kodu, co czyni je całkowicie nieodpowiednimi do monitorowania kompletnych aplikacji.
Z tych powodów oprzyrządowanie profilujące jest w większości odpowiednie do analizy hotspotów, które zostały już wykryte za pomocą innej metody, takiej jak profiler próbkowania. Instrumentując tylko wybrany zestaw klas i/lub metod, można ograniczyć profilowanie efektów ubocznych do określonych części aplikacji.
- 1. Wykorzystanie procesora Java VisualVM i powinowactwo procesora
- 2. ScheduledThreadPoolExecutor wykonanie niewłaściwego czasu z powodu niezgodności czasu procesora
- 3. Automatyczne uruchamianie profilowania procesora za pomocą VisualVM
- 4. Pobieranie informacji o dyrektywach pre-procesora
- 5. Dlaczego VisualVM nie wyświetla wszystkich normalnych zakładek?
- 6. VisualVM i Self Time
- 7. Spraw, aby program VisualVM pokazywał numery linii
- 8. Planowanie procesora: znalezienie czasu burstowego
- 9. Serwer Java NIO o dużym obciążeniu TCP
- 10. Wykonanie program php - wyświetlacz i zwróci wyniku
- 11. VisualVM Profilowanie aplikacji JavaFX
- 12. Dlaczego wnioskowanie o typie metody nie pozwala określić parametru typu?
- 13. Peptonowanie trawienia pełnych obiektów Javascript
- 14. Nie można uzyskać informacji o sesji Ripple
- 15. Nie możesz edytować informacji o pakiecie "..."
- 16. Dlaczego powiązanie procesora Java jest zależne od procesora?
- 17. Program obsługi znaczników czasu nie działa
- 18. readelf -s nie wypisuje pełnych nazw zmiennych
- 19. Jak mierzyć wykonanie skryptu i * analizowanie czasu *?
- 20. Dlaczego program Node.js jest skalowalny?
- 21. Dlaczego java udostępnia obiekt do deklarowania interfejsu wewnątrz interfejsu
- 22. Dlaczego program MongoDB nie używa właściwego indeksu?
- 23. Awaria aplikacji .NET bez informacji o debugowaniu
- 24. Limit czasu dla metody OracleDataReader.Read
- 25. Java nie generuje poprawnej informacji o strefie czasowej
- 26. Dlaczego wbudowany asembler GCC wymaga informacji o przenikaniu, ale MSVC nie jest
- 27. Dlaczego wykonanie MySQL powraca Brak?
- 28. Dlaczego program Eclipse Compiler traci parametr o ustalonym typie?
- 29. Parse.com - odświeżanie informacji o użytkowniku
- 30. Garbage Collector pobiera zbyt dużo czasu procesora
Link wygasł i jest teraz nieważny. Można wstawić ten przykład w pytaniu? – ADTC