Java-profilering är en process där man övervakar olika parametrar på JVM-nivå, t.ex. utförandet av metoder, trådar, skapande av objekt och sophämtning.Du kan få tråddumpar som en loggfil för alla processer som körs i JVM.En tråddump är en ögonblicksbild av tillståndet för alla trådar som ingår i den specifika processen.
I Linux kan du genom att ge kommandot ”jps” (verktyg för JVM-processstatus) få fram de instrumenterade HotSpot Java Virtual Machines (JVMs) på målsystemet med deras motsvarande process-ID.
Figur 1- JVM:er och deras pids.
Kommandot ”jps -l ” ger ut det fullständiga paketnamnet för programmets huvudklass eller det fullständiga sökvägsnamnet till programmets JAR-fil. se dokumentationen för jps för mer information.
Därefter kan vi använda kommandot ”jstack” för att fånga upp tråddumpar. jstack-verktyget levereras i mappen JDK_HOME/bin. Här är kommandot som du måste utfärda för att fånga tråddump: jstack <pid>. Här är pid process-ID för det program vars tråddump ska fångas upp. Så ”jstack 13626” i min konsol kommer att ge följande logg av tråddumpar som visas i figuren.
Inbyggda profileringsverktyg och deras implementering
Inom dessa finns det olika inbyggda verktyg för att göra profileringen av JVM som Java VisualVM,Honest Profiler, Async Profiler och Java Mission Controller
Innan vi går på djupet med dessa profiler bör vi känna till begreppet ”Safe point”. JVM tar internt hand om många saker åt oss, till exempel Garbage Collection och JIT Compilation. JVM behöver också sin egen tid för att reda ut vissa saker för sig själv, utanför programmet. En del av de saker som JVM kan göra kan involvera en safepoint (inklusive GC). Under en safepoint avbryts alla trådar som kör Java-kod så att JVM kan utföra sitt arbete. Programmet stannar upp under den tid som JVM går till en safepoint.Så vissa profilerare lider av dessa safepoint-problem där de ger en callback till de angivna trådarna, dessa trådar bör vara i en safepoint för att svara på denna callback, vilket påverkar prestandan.
Å andra sidan använder vissa profilerare ett internt API-anrop i openJDK, AsyncGetCallTrace (ASGT), för att underlätta insamling av stacktraces som inte är en safepoint. AsyncGetCallTrace är INTE ett officiellt JVM API.För att använda ASGT måste du först skapa en JVMTI-agent.Java Virtual Machine Tool Interface (JVMTI) är ett programmeringsgränssnitt som gör det möjligt för dig som programvaruutvecklare att skapa programvaruagenter som kan övervaka och styra dina program i Java-programmeringsspråket.Sätt sedan upp en signalhanterare som utlöser signalen vid önskad provfrekvens.Den signalen kommer att riktas till den pågående JVM:n och en av deras pågående trådar kommer att avbrytas och ringa tillbaka till vår signalhanterare.Se till att den avbrutna tråden körs i din signalhanterare och anropa AGCT .Honest profiler använder denna ASGT för att göra profilering .
The Honest profiler har två delar. En C++ JVMTI-agent som skriver ut en fil som innehåller all profileringsinformation om programmet som jvmti-agenten var kopplad till.Den andra delen är en Java-applikation som gör en profil baserad på denna logg som tidigare genererades.
ASGT-metoden kommer att se ut så här. AsyncGetCallTrace(ASGCT_CallTrace *trace,jint depth,void* ucontext) .Vi bör överlämna en pekare till ASGT call trace till den här metoden.
Problemet med det här tillvägagångssättet är att du får lite andra data än en typisk Java stack trace. Profilern måste bearbeta den och mappa den till raderna i källkoden för att vara användbar.
Async profiler är en provtagningsprofiler med låg overhead som fungerar genom att koppla en infödd Java-agent till en pågående JVM-process och samla in stacktraceproverna med hjälp av HotSpot-specifika API:er. Async-profiler fungerar endast på GNU/Linux och MacOS, och på det förstnämnda systemet använder den dessutom perf_events för att gräva i inhemsk kod också .Det allmänna tillvägagångssättet är att ta emot anropsstackar som genereras av perf_events och matcha dem med anropsstackar som genereras av AsyncGetCallTrace, för att få fram en korrekt profil av både Java- och inhemsk kod. Den använder perf_events API för att konfigurera CPU-sampling till en minnesbuffert och ber om en signal som ska levereras när en sampling sker. Signalhanteraren anropar sedan AGCT och sammanfogar de två staplarna: Java-stacken, som fångas upp av AGCT, och stacken för inhemsk + kärnan, som fångas upp av perf_events. För trådar som inte är Java-trådar behålls endast stacken perf_events.
Java Mission Controller (JMC) ger en detaljerad rapport om var och en av de specifika trådarna i varje JVM och deras processorkonsumtion i procent på ett effektivt sätt.Java Mission Control fungerar genom att interagera med en JMX-agent i JVM:en som har en MBean-server som integrerar med den inbyggda virtuella maskinen och app-instrumenteringen som körs i JVM:en. Det är en viktig fördel eftersom det verkligen sänker verktygets omkostnader eftersom det använder redan existerande krokar. Oracle uppger att detta normalt ligger långt under 1 % overheadkostnad.Här finns inget som du behöver installera eller koppla till din befintliga VM för att få det att fungera. Med Flight recorder finns det ett par flaggor som du måste aktivera, men inget att installera. Starta en terminal gå till din JDK bin-katalog och skriv bara jmc. JMC kommer att ge ut en GUI som innehåller dina pågående JVM:er. välj den JVM-process som du vill profilera och börja spela in genom att ange tidsgränsen.
Ett annat populärt alternativ är att använda Linux perf, som inte har direkt stöd för Java, men som har ett bra stöd för profilering av inhemsk kod, och som inte har några problem med att titta på kärnstaplar också. För JVM-stödet behöver vi en perf-mappning som mappar JIT-kompilerade adresser till funktionsnamn (som en följd av detta stöds endast kompilerade ramar; tolkarramar är osynliga)
Och en JIT-switch -XX:+PreserveFramePointer som ser till att perf kan gå igenom Java-stacken. När du använder den här typen av tillvägagångssätt förlorar du interpreter frames.Du kan inte profilera en äldre JVM som inte har flaggan PreserveFramePointer.Det kan finnas en del föråldrade poster i din perfmap eftersom JIT kan kompilera om koden.Eftersom JIT kastar bort en del kod kan en del funktioner hamna i en felaktig implementering.
In addition to these the Java 2 Platform Standard Edition (J2SE) has always provided a simple command line profilerings tool called HPROF for heap and cpu profiling. HPROF är ett verktyg som är inbyggt i JDK för profilering av CPU- och heap-användningen i en JVM. HPROF är faktiskt ett JVM-bibliotek som dynamiskt laddas via ett kommandoradsalternativ vid JVM-start och blir en del av JVM-processen. Genom att ange HPROF-alternativ vid uppstarten kan användaren begära olika typer av heap- och/eller cpu-profilering från HPROF. De data som genereras kan vara i text- eller binärt format och kan användas för att spåra och isolera prestandaproblem med minnesanvändning och ineffektiv kod. Filen i binärt format från HPROF kan användas med verktyg som HAT för att bläddra bland de allokerade objekten i heap.
Slutsats
Vi kan konstatera att den ärliga profileringen och Async-profileringen har övervunnit anomalin ”Suffering from safepoints” med hjälp av ett internt API-anrop i openJDK AsyncGetCallTrace.De kan utföra profileringen med mycket mindre overhead än de vanliga profileringsverktygen, men de kan inte ge en detaljerad profilering av de trådar som är specifika för JVM-processerna separat.De kan bara ge ut en loggfil/GUI-gränssnitt av hela tråddumparna som en grupp.Å andra sidan kan Java Mission Control profilera de trådar som är specifika för varje process separat där du kan övervaka de heta trådarna med deras CPU-användning.JMC är alltså det bästa alternativet för att övervaka JVM-parametrarna med stor noggrannhet.
Referenser.
Java Virtual Machine Process Status Tool Oracle Documentation.
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
Skapa en agent för felsökning och profilering med JVMTI
http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
För- och nackdelar med AsyncGetCallTrace-profiler
http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html
En JVM-profilering med provtagning utan safepoint-provtagningsbias.Honest Profiler
https://github.com/jvm-profiling-tools/honest-profiler
Provtagning av CPU- och HEAP-profiler för Java med AsyncGetCallTrace + perf_events
https://github.com/jvm-profiling-tools/async-profiler