Builtin Profiling tools and their Implementation
Ezeken kívül vannak különböző beépített eszközök a JVM profilozására, például a Java VisualVM,Honest Profiler, Async Profiler és Java Mission Controller
Mielőtt elmélyednénk ezekben a profilozókban, ismernünk kell a ‘Safe point’ fogalmát. A JVM belsőleg sok mindenről gondoskodik helyettünk, például a szemétgyűjtésről és a JIT-fordításról. Tehát a JVM-nek is szüksége van a saját idejére, hogy néhány dolgot magának rendezzen, az alkalmazáson kívül. Néhány dolog, amit a JVM elvégezhet, magában foglalhat egy safepointot (beleértve a GC-t is). A safepoint alatt a Java kódot futtató összes szál felfüggesztésre kerül, hogy a JVM elvégezze a munkáját. Az alkalmazás leáll arra az időre, amíg a JVM a safepointba megy.Így néhány profilozó szenved ezektől a safepoint problémáktól, ahol egy visszahívást adnak a megadott szálaknak ,ezeknek a szálaknak safepointban kell lenniük, hogy válaszoljanak a visszahívásra.Így ez befolyásolja a teljesítményt.
A másik oldalon néhány profilozó egy openJDK belső API hívást használ AsyncGetCallTrace (ASGT), hogy megkönnyítse a stack traces nem safepointos gyűjtését. Az AsyncGetCallTrace NEM hivatalos JVM API.Az ASGT használatához először hozzon létre egy JVMTI ügynököt.A Java Virtual Machine Tool Interface (JVMTI) egy olyan programozási felületet biztosít, amely lehetővé teszi, hogy Ön, a szoftverfejlesztő, olyan szoftverügynököket hozzon létre, amelyek képesek a Java programozási nyelvű alkalmazások felügyeletére és vezérlésére.Ezután állítson be egy jelkezelőt, amely a kívánt mintavételi gyakorisággal jelet vált ki.Ez a jel a futó JVM-hez lesz irányítva, és az egyik futó szál megszakad, és visszahívja a jelkezelőnket.Győződjön meg róla, hogy a megszakított szál fut a jelkezelőben, és hívja meg az AGCT-t.A Honest profiler ezt az ASGT-t használja a profilozáshoz .
A Honest profiler két részből áll. Egy C++ JVMTI ügynök, amely kiír egy fájlt, amely tartalmazza az összes profilozási információt az alkalmazásról, amelyhez a jvmti ügynök csatlakozott.A második rész, egy Java alkalmazás, amely egy profilt készít ezen a korábban generált napló alapján.
ASGT módszer így néz ki. AsyncGetCallTrace(ASGCT_CallTrace *trace,jint depth,void* ucontext) .ehhez a metódushoz át kell adnunk egy mutatót az ASGT hívásnyomra.
A probléma ezzel a megközelítéssel az, hogy kissé más adatokat kapunk, mint egy tipikus Java stack trace. A profilozónak fel kell dolgoznia és le kell képeznie a forráskód soraihoz, hogy hasznos legyen.
Async profiler egy alacsony rezsijű mintavételi profilozó, amely úgy működik, hogy egy natív Java ügynököt csatol egy futó JVM folyamathoz és HotSpot-specifikus API-k segítségével gyűjti a stack traces mintákat. Az Async-profiler csak GNU/Linuxon és MacOS-en működik, és az előbbin a perf_events-et is használja, hogy a natív kódba is beleássa magát .Az általános megközelítés a perf_events által generált hívási veremek fogadása és összevetése az AsyncGetCallTrace által generált hívási veremekkel, hogy pontos profilt készítsen mind a Java, mind a natív kódról. A perf_events API-t használja a CPU-mintavételezés beállításához egy memóriapufferbe, és jelzést kér, amikor egy minta bekövetkezik. A jelkezelő ezután meghívja az AGCT-t, és összevonja a két stacket: az AGCT által rögzített Java stacket és a perf_events által rögzített natív + kernel stacket. A nem Java szálak esetében csak a perf_events verem marad meg.
A Java Mission Controller(JMC) részletes jelentést ad az egyes JVM-ekben lévő egyes konkrét szálakról és azok CPU-fogyasztási százalékáról hatékony módon.A Java Mission Control a JVM-ben lévő JMX-ügynökkel való interakció révén működik, amely egy MBean-kiszolgálóval rendelkezik, amely integrálódik a beépített VM és a JVM-ben futó alkalmazásinstrumentációval. Ez egy kulcsfontosságú előny, mivel valóban csökkenti az eszköz rezsiköltségét, mivel előre meglévő horgokat használ. Az Oracle állítása szerint ez általában jóval 1% alatti rezsiköltséget jelent.Itt nincs semmi, amit telepítenie vagy a meglévő VM-hez csatlakoztatnia kellene ahhoz, hogy működjön. A Flight Recorder esetében van néhány zászló, amelyet engedélyeznie kell, de semmit sem kell telepítenie. Indítson el egy terminált, menjen a JDK bin könyvtárába, és csak írja be a jmc-t. A JMC egy GUI-t fog kiadni, amely tartalmazza a futó JVM-eket.Válassza ki azt a JVM folyamatot, amelyet profilozni kell, és kezdje el a rögzítést az időkorlát megadásával.
Egy másik népszerű alternatíva a Linux perf használata, amely közvetlenül nem támogatja a Java-t, de nagyszerűen támogatja a natív kód profilozását, és nem okoz gondot a kernel stackek áttekintése sem. A JVM-támogatáshoz szükségünk van egy perf-térképre, amely a JIT-kompilált címeket függvénynevekre képezi le (ebből következően csak a kompilált keretek támogatottak; az interpreter keretei láthatatlanok)
És egy JIT-kapcsolóra -XX:+PreserveFramePointer, amely biztosítja, hogy a perf végig tudja járni a Java stacket. Ha ezt a fajta megközelítést használod,akkor az interpreter frame-ek elvesznek.Nem tudsz profilozni egy régebbi JVM-et, ami nem rendelkezik a PreserveFramePointer flaggel.Lehet, hogy lesz néhány elavult bejegyzés a perfmap-ben, mert a JIT újra tudja fordítani a kódot.Mivel a JIT eldob néhány kódot, néhány funkcionalitás nem megfelelő implementációval kerülhet ki.
Ezeken kívül a Java 2 Platform Standard Edition (J2SE) mindig is biztosított egy egyszerű parancssori profilozó eszközt HPROF néven a heap és cpu profilozáshoz. A HPROF a JDK-ba épített eszköz a CPU és a heap használatának profilozására a JVM-en belül. a HPROF tulajdonképpen egy JVM natív ügynökkönyvtár, amely dinamikusan betöltődik egy parancssori opcióval, a JVM indításakor, és a JVM folyamat részévé válik. A HPROF-opciók indításkor történő megadásával a felhasználók különböző típusú heap és/vagy cpu profilozási funkciókat kérhetnek a HPROF-tól. A generált adatok szöveges vagy bináris formátumúak lehetnek, és felhasználhatók a memóriahasználattal és a nem hatékony kóddal kapcsolatos teljesítményproblémák felkutatására és elkülönítésére. A HPROF-tól származó bináris formátumú fájl olyan eszközökkel használható, mint a HAT, a heapben lévő allokált objektumok böngészésére.
Következtetés
Megfigyeltük, hogy az őszinte profilozás és az Async profilozás egy openJDK belső API hívás AsyncGetCallTrace segítségével legyőzte a “Suffering from safepoints” anomáliát.A profilozást sokkal kisebb rezsiköltséggel tudják elvégezni, mint a szabványos profilozó eszközök. de nem tudnak részletes profilozást nyújtani a szálakról, amelyek a JVM folyamatokra külön-külön jellemzőek. csak egy naplófájlt / GUI felületet tudnak kiadni a teljes szálak dumps mint egy csomó.Másrészt a Java Mission Control képes az egyes folyamatokra jellemző szálak külön-külön profilozására, ahol nyomon követheti a forró szálakat a CPU-használatukkal együtt.Így a JMC a legjobb lehetőség a JVM paramétereinek nagy granularitású nyomon követésére.
Hivatkozások.
Java Virtual Machine Process Status Tool Oracle Documentation.
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
Debugging and Profiling Agent létrehozása a JVMTI-vel
http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
The Pros and Cons of AsyncGetCallTrace Profilers
http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html
A sampling JVM profiler without the safepoint sample bias-ról
A mintavételező JVM profiler nélkül.Honest Profiler
https://github.com/jvm-profiling-tools/honest-profiler
Mintavételező CPU és HEAP profilozó Java számára, amely AsyncGetCallTrace + perf_events
https://github.com/jvm-profiling-tools/async-profiler