Profilování Javy je proces sledování různých parametrů na úrovni JVM, jako je provádění metod, provádění vláken, vytváření objektů a sběr odpadu.Výpisy vláken můžete získat jako soubor protokolu všech procesů, které jsou spuštěny v JVM. výpis vláken je snímek stavu všech vláken, která jsou součástí určitého procesu.
V Linuxu zadáním příkazu ‚jps‘ (nástroj pro zjištění stavu procesu JVM) můžete získat instrumentované virtuální stroje Java HotSpot (JVM) v cílovém systému s jejich odpovídajícím ID procesu.
Obrázek 1- JVM a jejich pids.
Příkaz ‚jps -l ‚ vypíše úplný název balíčku pro hlavní třídu aplikace nebo úplný název cesty k souboru JAR aplikace. další informace naleznete v dokumentaci jps.
Poté můžeme použít příkaz ‚jstack‘ pro zachycení výpisů vláken. nástroj jstack je dodáván ve složce JDK_HOME/bin. Zde je příkaz, který je třeba zadat pro zachycení výpisu vláken:jstack <pid>. Zde pid je ID procesu aplikace, jejíž výpis vláken má být zachycen. Takže příkaz ‚jstack 13626‘ v mé konzoli vypíše následující protokol výpisů vláken, jak je znázorněno na obrázku.
Vestavěné profilovací nástroje a jejich implementace
Kromě toho existují různé vestavěné nástroje pro profilování JVM, například Java VisualVM,Honest Profiler, Async Profiler a Java Mission Controller
Než se pustíme do hloubky těchto profilovačů, měli bychom znát pojem „bezpečný bod“. JVM se interně stará o mnoho věcí za nás, například o Garbage Collection a JIT Compilation. JVM tedy také potřebuje svůj vlastní čas, aby si některé věci vyřešil sám pro sebe, mimo aplikaci. Některé věci, které může JVM dělat, mohou zahrnovat bezpečný bod (včetně GC). Během safepointu jsou všechna vlákna běžící v kódu Javy pozastavena, aby JVM mohl provést svou práci. Aplikace se zastaví na dobu, kdy JVM přejde do safepointu.
Některé profilery tedy trpí problémem těchto safepointů, kdy zadaným vláknům dávají zpětné volání ,tato vlákna by měla být v safepointu, aby mohla reagovat na toto zpětné volání.
Na druhou stranu některé profilery používají interní volání API openJDK AsyncGetCallTrace (ASGT), aby usnadnily sběr stop zásobníku bez safepointů. AsyncGetCallTrace NENÍ oficiální rozhraní API JVM.Chcete-li použít ASGT, vytvořte nejprve agenta JVMTI .Java Virtual Machine Tool Interface (JVMTI) poskytuje programovací rozhraní, které vám, vývojářům softwaru, umožňuje vytvářet softwarové agenty, kteří mohou monitorovat a řídit vaše aplikace v programovacím jazyce Java. poté nastavte obsluhu signálu, která spouští signál v požadované frekvenci vzorků.Tento signál bude směřovat do běžícího JVM a jedno z jeho běžících vláken bude přerušeno a zavolá zpět naši obsluhu signálu. zajistěte, aby přerušené vlákno běželo ve vaší obsluze signálu, a zavolejte AGCT .Honest profiler používá tento ASGT k profilování .
Honest profiler má dvě části. Agent C++ JVMTI, který vypisuje soubor obsahující všechny profilovací informace o aplikaci, ke které byl agent jvmti připojen.
Druhou částí je aplikace Java, která vykresluje profil na základě tohoto dříve vygenerovaného protokolu.
Metoda ASGT bude vypadat takto. AsyncGetCallTrace(ASGCT_CallTrace *trace,jint depth,void* ucontext) .této metodě bychom měli předat ukazatel na stopu volání ASGT.
Problémem tohoto přístupu je, že získáme trochu jiná data než typickou stopu zásobníku Javy. Profiler je musí zpracovat a namapovat na řádky zdrojového kódu, aby byl užitečný.
Async profiler je profiler pro vzorkování s nízkou režií, který pracuje tak, že připojí nativního agenta Javy k běžícímu procesu JVM a sbírá vzorky stop zásobníku pomocí API specifických pro HotSpot. Async-profiler funguje pouze v systémech GNU/Linux a MacOS, přičemž v prvně jmenovaném systému navíc využívá perf_events k prozkoumání nativního kódu.Obecný přístup spočívá v přijímání zásobníků volání generovaných pomocí perf_events a jejich porovnávání se zásobníky volání generovanými pomocí AsyncGetCallTrace s cílem vytvořit přesný profil kódu Javy i nativního kódu. Používá rozhraní API perf_events ke konfiguraci vzorkování procesoru do paměťové vyrovnávací paměti a žádá o doručení signálu, když dojde ke vzorkování. Obsluha signálu pak zavolá AGCT a sloučí oba zásobníky dohromady: zásobník Javy zachycený AGCT a nativní zásobník + zásobník jádra zachycený perf_events. U jiných než javovských vláken je zachován pouze zásobník perf_events.
Java Mission Controller(JMC) poskytuje podrobnou zprávu o každém z konkrétních vláken v každém JVM a jejich procentuální spotřebě CPU efektivním způsobem.Java Mission Control funguje na základě interakce s agentem JMX v JVM, který má MBean server, který se integruje s vestavěným virtuálním počítačem a instrumentací aplikací běžících v JVM. To je klíčová výhoda, protože skutečně snižuje režijní náklady nástroje, protože využívá již existující háčky. Společnost Oracle uvádí, že tato režie se obvykle pohybuje hluboko pod 1 %. zde není nic, co byste museli instalovat nebo připojovat ke stávajícímu virtuálnímu počítači, aby to fungovalo. U Flight recorderu je třeba povolit několik příznaků, ale nic se neinstaluje. Spusťte terminál, přejděte do adresáře JDK bin a jednoduše zadejte jmc. jMC vypíše grafické rozhraní obsahující vaše běžící JVM. vyberte proces JVM, který potřebujete profilovat, a začněte nahrávat zadáním časového limitu.
Další oblíbenou alternativou je použití linuxového perfu, který sice nepodporuje přímo Javu, ale má skvělou podporu pro profilování nativního kódu a nedělá mu problém nahlížet i do jaderných zásobníků. Pro podporu JVM potřebujeme mapu perf, která mapuje adresy zkompilované JIT na jména funkcí (jako důsledek jsou podporovány pouze zkompilované rámce; rámce interpretu jsou neviditelné)
A přepínač JIT -XX:+PreserveFramePointer, který zajistí, že perf může procházet zásobník Javy. Při použití takového přístupu nakonec přijdete o rámce interpretu.Nemůžete profilovat starší JVM, které nemá příznak PreserveFramePointer.Ve vaší perfmapě mohou být zastaralé záznamy, protože JIT může kód překompilovat.Protože JIT zahazuje část kódu, některé funkce mohou být nakonec nesprávně implementovány.
Kromě toho Java 2 Platform Standard Edition (J2SE) vždy poskytovala jednoduchý profilovací nástroj příkazového řádku nazvaný HPROF pro profilování haldy a procesoru. HPROF je nástroj integrovaný do JDK pro profilování využití CPU a haldy v rámci JVM. HPROF je vlastně nativní knihovna agenta JVM, která se dynamicky načte prostřednictvím volby příkazového řádku, při spuštění JVM a stane se součástí procesu JVM. Zadáním možností HPROF při spuštění si uživatelé mohou od HPROF vyžádat různé typy funkcí profilování haldy a/nebo procesoru. Generovaná data mohou být v textovém nebo binárním formátu a lze je použít ke sledování a izolaci výkonnostních problémů týkajících se využití paměti a neefektivního kódu. Soubor v binárním formátu z HPROF lze použít s nástroji, jako je HAT, k procházení alokovaných objektů v haldě.
Závěr
Pozorujeme, že poctivé profilování a profilování Async překonalo anomálii „Utrpení z bezpečných bodů“ pomocí interního volání API openJDK AsyncGetCallTrace.Mohou provádět profilování s mnohem menšími režijními náklady než standardní profilovací nástroje. nemohou však poskytovat podrobné profilování vláken, která jsou specifická pro procesy JVM zvlášť. mohou pouze vypisovat soubor protokolu / rozhraní GUI výpisů celých vláken jako svazek.Na druhou stranu Java Mission Control dokáže profilovat vlákna, která jsou specifická pro jednotlivé procesy zvlášť, kde můžete sledovat horká vlákna s jejich využitím CPU. proto je JMC nejlepší volbou pro sledování parametrů JVM s velkou granularitou.
Reference.
Java Virtual Machine Process Status Tool Oracle Documentation.
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
Vytvoření agenta pro ladění a profilování pomocí JVMTI
http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
Výhody a nevýhody profileru AsyncGetCallTrace
http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html
Vzorkovací profiler JVM bez zkreslení vzorku safepoint-.Honest Profiler
https://github.com/jvm-profiling-tools/honest-profiler
Vzorkovací profiler CPU a HEAP pro Javu obsahující AsyncGetCallTrace + perf_events
https://github.com/jvm-profiling-tools/async-profiler