Visual VM i VisualVM API
Adam Dudczak
adudczak (at) gmail.com
Poznań NetBeans Day
2 grudnia 2008
Plan prezentacji
1
2
3
Czym jest VisualVM?
Aplikacja stworzona w oparciu o NetBeans Platform
Począwszy od Java update 1.6 07, dostarczane razem z Sun JDK
VisualVM to projekt otwarty, którego kod dostępny jest na
licencji GPLv2
Aplikacja w ramach której zintegrowano istniejące narzędzia JDK
jinfo, jmap, jstack, jstat, jhat, jps
JConsole
NetBeans profiler
Narzędzia diagnostyczne dostępne
w JDK
jps – lista procesów JVM, analog unix’owego polecenia ps
jinfo – podstawowe informacje o działającym procesach JVM
jstat – statystyki dotyczące działania GC, ładowania klas i
kompilacji
jstack – zrzut stanu wątków (nawet gdy JVM wisi)
jmap – zrzut zawartości sterty, zapis w formacie hprof
jhat – przeglądania zawartości zrzutu sterty
jconsole – zużycie pamięci, klient JMX i inne
Przykład 1 : Wykorzystanie
narzędzi dostępnych w JDK
>jps
1234 jps
4296 Main --branding nb
>jstack 4296 >thread-dump.txt
>jmap -dump:format=b,file=heap.hprof 4296
>jhat -J-mx512m heap.hprof
Reading from heap.bin...
Dump file created Mon Oct 20 20:31:40 CEST 2008
Snapshot read, resolving...
...
Started HTTP server on port 7000
Server is ready.
> przegladarka http://localhost:7000
Funkcje dostępne w VisualVM (1)
VisualVM integruje to co już jest dostępne:
Uzyskać podstawowe informacje o procesach Javy działających
lokalnie i zdalnie
Monitorować przebieg wykonania wątków danej aplikacji
Możliwość wykonania i zapisania zrzutu aktualnego stanu wątków
(ang. Thread dump)
Zrzut zawartości sterty (ang. Heap dump)
Funkcje dostępne w VisualVM (2)
Możliwość porównania zużycia pamięci i stanu wątków w różnych
stadiach wykonania programu
Profiler – umożliwiający badanie utyliacji czasu procesora i
pamięci
W pełni funkcjonalny klient JMX
Pełna zgodność z API pluginów do JConsole (por. JTop)
Wizualizacja działania Garbage Collectora (Visual GC) i inne
Co ze starszymi wersjami Javy?
Tabele dostępnych funkcji
Aplikacje lokalne
1.42
5.0
6.0
7.0
jvmstat
X
X
X
X
jmx
X
1
X
X
attach
X
X
Dostęp zdalny
1.42
5.0
6.0
7.0
jvmstat
2
X
X
X
X
jmx
3
X
X
X
attach
1
Wymaga ustawienia -Dcom.sun.management.jmxremote
2
Na zdalnej maszynie musi działać jstatd
3
Wymaga ustawienia
-Dcom.sun.management.jmxremote.port=numer
JStat vs JMX vs Attach
funkcja
jvmstat
jmx
attach
wykrycie działającej aplikacji
X
X
monitoring
X
X
podgląd wątków
X
profiler
X
zrzut wątków
X
X
zrzut sterty
X
X
wywołanie GC
X
OOME
X
X
Własności systemowe
X
X
Argumenty JVM
X
X
Main class
X
Przykład 2 : możliwości VisualVM
Funkcje znane z JConsole: podstawowe informacje,
monitorowanie działania
Thread Dump Analyzer
Heap Dump Analyzer (wczytanie heap.hprof z przykładu 1)
Czy możliwe jest wykonanie zdalnego zrzutu sterty?
NetBeans Profiler
Czy możliwy jest profilowanie aplikacji działącej na innej
maszynie?
Generowanie hierarchii wywołań
Dwa słowa o uruchamianiu jstatd
jstatd jest częścią JDK 1.6
Przy próbie uruchomienia jstatd może pojawić się błąd :
Could not create remote object access denied
Problem z polityką wykorzystania tools.jar, co trzeba zrobić:
stworzyć plik tools.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
uruchomić jstatd:
jstatd J-Djava.security.policy=tools.policy
trzeba również pamiętać aby uruchomić ten proces z poziomu tego
samego użytkownika co monitorowana aplikacja
Uruchomienie profilera
Dla poprawnego działania profilera w przypadku JDK ¡ 1.6 06
należy uruchomić aplikacje z parametrem: -Xshare:off.
Przy pierwszym uruchomieniu profiler przeprowadzi kalibracje
wszystkie rzeczy optymalizujące szybkość procesora (np.
SpeedStep) powinny byc wyłączone.
Profiler używa metody (interfejs JVMTI)
redefineClass(Class[] classes, byte[][] newBC)
Profilowanie aplikacji działających
w śrdowisku produkcyjnym
Czy można profilować zdalne aplikacje?
Profiler w wersji oryginalnej (z NetBeans IDE) umożliwia
przeprowadzenie takiej operacji
Na zdalnej maszynie trzeba zainstalować : Profiler Remote Pack
Spadek wydajności po uruchomieniu profilera od 60% do 40%
Mimo wykorzystania mechanizmu ograniczania liczby
modyfikowanych metod poprawa wydajności jest niewielka
Rozszerzenie VisualVM
Najważniejsze punkty rozszerzeń to:
ApplicationType (1)
SingleDataSourceAction (2)
DataSource i
DataSourceDescription (3)
Rozszerzenie VisualVM
DataSourceView i Pluggable-
DataSourceViewProvider (4)
DataSourceViewPlugin (5)
Przykład 3 : Tworzymy pierwsze
rozszerzenie
Szablony i kreatory ułatwiające tworzenie rozszerzeń można pobrać
z http://plugins.netbeans.org/.
Tworzenie DataSourceView
Nasz własny ApplicationType
Java IDE Wars VisualVm plugin :)
Java IDE Wars VisualVm plugin
Java IDE Wars VisualVm plugin został stworzony na bazie hitu
„Shootout” autorstwa Dawida Weissa.
http://www.cs.put.poznan.pl/dweiss/xml/projects/shootout/index.xml
Podsumowanie - braki
Wydaje sie że jest techniczna mozliwość aby zintegrować opcje
robienia zdalnych zrzutów pamięci w głównym menu
(jmx: com.sun.managment.HotSpotDiagnostic.dumpHeap())
Brak możliwości wydawania zaawansowanych zapytań jak w jhat
(np. select s from j.l.String s where s.count = 1024)
Czy można poprawić wydajność profilera? (czas próbkowania)
Wsparcie dla Profiler Remote Pack
Podsumowanie - zalety
Wszystko w jednym miejscu
Przyjemne, dobrze zrobione GUI
Sporo nowych wtyczek, łatwa aktualizacja
Dobrze udokumentowany proces tworzenia wtyczek
Na pewno warto o tym narzędziu pamiętać
Czytanki
Strona projektu VisualVM – https://visualvm.dev.java.net
„Using VisualVM to find and resolve performance issue in
Liferay” – http://kanonbra.com/index.php/projects/
performance-testing/18-using-visualvm-on-liferay
„Profiling With VisualVM, Part 2” – http://blogs.sun.com/
nbprofiler/entry/profiling_with_visualvm_part_2
„JDK Tools and Utilities” – http://java.sun.com/javase/
6/docs/technotes/tools/index.html
Czytanki (2)
„Getting Started Extending VisualVM (Part 1)” –
http://blogs.sun.com/geertjan/entry/getting_started_
extending_visualvm
i wszystkie następne częsci...
Dziękuje za uwagę
Pytania ?
Adam Dudczak
adudczak (at) gmail.com