Profilarea Java este procesul de monitorizare a diferiților parametri la nivel JVM, cum ar fi execuția metodelor, execuția firelor, crearea de obiecte și colectarea gunoiului.Puteți obține fișiere de evidență a firelor ca fișier jurnal al tuturor proceselor care rulează în JVM.Un fișier de evidență a firelor este un instantaneu al stării tuturor firelor care fac parte dintr-un anumit proces.
În linux, prin comanda ‘jps’ (instrument de stare a proceselor JVM) puteți obține mașinile virtuale Java (JVM) HotSpot instrumentate pe sistemul țintă cu ID-ul de proces corespunzător.
Figura 1- JVM-uri și pids-urile lor.
Comanda ‘jps -l ‘ afișează numele complet al pachetului pentru clasa principală a aplicației sau numele complet al căii de acces la fișierul JAR al aplicației. consultați documentația jps pentru mai multe informații.
După aceasta putem utiliza comanda ‘jstack’ pentru a capta descărcările de fire de execuție. instrumentul jstack este livrat în folderul JDK_HOME/bin. Iată comanda pe care trebuie să o emiteți pentru a captura vidarea firelor de execuție:jstack <pid>. Aici pid este ID-ul de proces al aplicației, a cărei descărcare a firelor de execuție trebuie să fie capturată. Așadar, „jstack 13626” în consola mea va afișa următorul jurnal al descărcărilor de fire, așa cum se arată în figură.
Instrumente de profilare integrate și implementarea lor
În plus, există diverse instrumente integrate pentru a realiza profilarea JVM, cum ar fi Java VisualVM,Honest Profiler, Async Profiler și Java Mission Controller
Înainte de a intra în profunzimea acestor profilatoare, ar trebui să cunoaștem conceptul de „Safe point”. JVM se ocupă în mod intern de multe lucruri pentru noi, cum ar fi Garbage Collection și JIT Compilation. Așadar, JVM are nevoie și de timpul său pentru a rezolva unele lucruri pentru sine, în afara aplicației. Unele dintre lucrurile pe care JVM le poate face pot implica un punct de siguranță (inclusiv GC). În timpul unui safepoint, toate firele care rulează cod Java sunt suspendate pentru ca JVM să își facă treaba. Aplicația se oprește în timpul în care JVM trece la un safepoint.Astfel, unele profilatoare suferă de aceste probleme de safepoint în care dau un callback la firele specificate, iar aceste fire ar trebui să se afle într-un safepoint pentru a răspunde la acel callback.Astfel, performanța este afectată.
Pe de altă parte, unele profilatoare utilizează un apel API intern openJDK numit AsyncGetCallTrace (ASGT) pentru a facilita colectarea fără safepoint a urmelor de stivă. AsyncGetCallTrace NU este un API oficial al JVM.Pentru a utiliza ASGT, mai întâi creați un agent JVMTI .Interfața Java Virtual Machine Tool Interface (JVMTI) oferă o interfață de programare care vă permite dumneavoastră, dezvoltatorul de software, să creați agenți software care pot monitoriza și controla aplicațiile dumneavoastră în limbajul de programare Java.Apoi configurați un gestionar de semnal care declanșează semnalul la frecvența de eșantionare dorită.Acel semnal va fi direcționat către JVM în curs de execuție, iar unul dintre firele de execuție ale acestuia va fi întrerupt și va apela înapoi la gestionarul nostru de semnal.Asigurați-vă că firul de execuție întrerupt este în curs de execuție în gestionarul de semnal și apelați AGCT .Honest profiler utilizează acest ASGT pentru a realiza profilarea .
Profilatorul Honest are două părți. Un agent JVMTI C++ care scrie un fișier care conține toate informațiile de profilare despre aplicația la care a fost atașat agentul jvmti.A doua parte, este o aplicație Java care redă un profil bazat pe acest jurnal care a fost generat anterior.
Metoda ASGT va arăta astfel. AsyncGetCallTrace(ASGCT_CallTrace *trace,jint depth,void* ucontext) .Ar trebui să trecem un pointer la urmărirea apelurilor ASGT la această metodă.
Problema cu această abordare este că se obțin date ușor diferite față de o urmărire tipică a stivei Java. Profilatorul trebuie să le proceseze și să le mapeze la liniile din codul sursă pentru a fi util.
Profilatorul asincron este un profilator de eșantionare cu costuri reduse care funcționează prin atașarea unui agent Java nativ la un proces JVM în execuție și colectarea mostrelor de urme de stivă prin utilizarea API-urilor specifice HotSpot. Async-profiler funcționează numai pe GNU/Linux și MacOS, iar pe primul utilizează în plus perf_events pentru a săpa și în codul nativ .Abordarea generală constă în primirea stivei de apeluri generate de perf_events și compararea lor cu stivele de apeluri generate de AsyncGetCallTrace, pentru a produce un profil precis atât al codului Java, cât și al celui nativ. Utilizează API-ul perf_events pentru a configura eșantionarea CPU într-un buffer de memorie și solicită transmiterea unui semnal atunci când are loc o eșantionare. Gestionarul de semnal apelează apoi AGCT și unește cele două stive: stiva Java, capturată de AGCT, și stiva nativă + kernel, capturată de perf_events. Pentru firele care nu sunt Java, este reținută doar stiva perf_events.
Java Mission Controller(JMC) oferă un raport detaliat al fiecăruia dintre firele specifice din fiecare JVM și procentul de consum al CPU-ului într-o manieră eficientă.Java Mission Control funcționează prin interacțiunea cu un agent JMX în JVM, care are un server MBean care se integrează cu VM încorporat și cu instrumentarea aplicației care rulează în JVM. Acesta este un avantaj cheie, deoarece reduce cu adevărat costurile generale ale instrumentului, deoarece utilizează cârlige preexistente. Oracle declară că, în mod normal, acest lucru este cu mult sub 1% din costurile generale.Aici nu trebuie să instalați sau să atașați nimic la VM-ul existent pentru a-l face să funcționeze. Cu Flight recorder, există câteva stegulețe pe care trebuie să le activați, dar nimic de instalat. Porniți un terminal, mergeți la directorul JDK bin și doar tastați jmc.JMC va afișa o interfață grafică care conține JVM-urile dvs. în execuție.Selectați procesul JVM pe care trebuie să-l profilați și începeți înregistrarea specificând limita de timp.
O altă alternativă populară este utilizarea Linux perf, care nu suportă direct Java, dar are un suport excelent pentru profilarea codului nativ și nu are probleme în a examina și stivele de kernel. Pentru suportul JVM avem nevoie de o hartă perf care mapează adresele compilate JIT în nume de funcții (ca un corolar, doar cadrele compilate sunt suportate; cadrele interpretorului sunt invizibile)
Și un comutator JIT -XX:+PreserveFramePointer care se asigură că perf poate parcurge stiva Java. Atunci când folosiți acest tip de abordare, ajungeți să pierdeți cadrele de interpretare.Nu puteți face profilul unei JVM mai vechi care nu are stegulețul PreserveFramePointer.Este posibil să existe unele intrări vechi în perfmap-ul dvs. deoarece JIT poate recompila codul.Deoarece JIT aruncă o parte din cod, unele funcționalități pot sfârși prin a avea o implementare necorespunzătoare.
În plus față de acestea, Java 2 Platform Standard Edition (J2SE) a oferit întotdeauna un instrument simplu de profilare în linie de comandă numit HPROF pentru profilarea heap și cpu. HPROF este un instrument încorporat în JDK pentru profilarea utilizării CPU și heap în cadrul unei JVM. HPROF este de fapt o bibliotecă agent nativ JVM care este încărcată dinamic printr-o opțiune de linie de comandă, la pornirea JVM, și devine parte a procesului JVM. Furnizând opțiunile HPROF la pornire, utilizatorii pot solicita diverse tipuri de caracteristici de profilare a heap și/sau cpu de la HPROF. Datele generate pot fi în format textual sau binar și pot fi utilizate pentru a depista și izola problemele de performanță care implică utilizarea memoriei și codul ineficient. Fișierul în format binar de la HPROF poate fi utilizat cu instrumente precum HAT pentru a parcurge obiectele alocate în heap.
Concluzie
Observăm că profilarea onestă și profilarea Async au depășit anomalia „Suferința de puncte de siguranță” prin intermediul unui apel API intern openJDK AsyncGetCallTrace.Acestea pot realiza profilarea cu mult mai puține cheltuieli generale decât instrumentele de profilare standard. dar nu pot oferi o profilare detaliată a firelor care sunt specifice proceselor JVM separat. ele nu pot produce decât un fișier jurnal/interfață GUI a tuturor descărcărilor de fire ca o grămadă.Pe de altă parte, Java Mission Control poate realiza profilul firelor care sunt specifice fiecărui proces în parte, unde puteți monitoriza firele fierbinți cu utilizarea lor de CPU.Astfel, JMC este cea mai bună opțiune pentru a monitoriza parametrii JVM cu multă granularitate.
Referințe.
Java Virtual Machine Process Status Tool Documentația Oracle.
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
Crearea unui agent de depanare și profilare cu JVMTI
http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
Avantajele și dezavantajele profilatoarelor AsyncGetCallTrace
http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html
Un profilator JVM de eșantionare fără prejudecata de eșantionare a punctului de siguranță-.Honest Profiler
https://github.com/jvm-profiling-tools/honest-profiler
Profiler de eșantionare CPU și HEAP pentru Java cu AsyncGetCallTrace + perf_events
https://github.com/jvm-profiling-tools/async-profiler
.