Kuvio 1- JVM:t ja niiden pid.
’jps -l ’ -komento tulostaa sovelluksen pääluokan täydellisen paketin nimen tai sovelluksen JAR-tiedoston täydellisen polun nimen.Katso lisätietoja jps:n dokumentaatiosta.
Sen jälkeen voimme käyttää komentoa ’jstack’ säikeiden dumppien kaappaamiseen. jstack-työkalu toimitetaan JDK_HOME/bin-kansiossa. Tässä on komento, joka sinun täytyy antaa kaapata säie-dumppi:jstack <pid>. Tässä pid on sen sovelluksen prosessitunnus, jonka säie-dumppi halutaan kaapata. Joten ’jstack 13626’ konsolissani tulostaa seuraavan login thread dumpeista, kuten kuvassa näkyy.
Rakennetut profilointityökalut ja niiden toteutus
Näiden työkalujen lisäksi on olemassa erilaisia sisäänrakennettuja työkaluja, joiden avulla voidaan tehdä JVM:n profilointi, kuten esimerkiksi JVM:n Javaan,Honest Profiler, Async Profiler ja Java Mission Controller
Ennen kuin menemme syvälle näihin profilointilaitteisiin, meidän pitäisi tuntea käsite ’Safe point’. JVM huolehtii sisäisesti monista asioista puolestamme, kuten roskien keräämisestä ja JIT-kompilaatiosta. Joten JVM tarvitsee myös omaa aikaa selvittääkseen joitakin asioita itselleen, sovelluksen ulkopuolella. Joitakin asioita, joita JVM voi tehdä, saattaa liittyä turvapisteeseen (mukaan lukien GC). Safepointin aikana kaikki Java-koodia suorittavat säikeet keskeytetään, jotta JVM voi tehdä työnsä. Sovellus pysähtyy siksi ajaksi, kun JVM menee safepointtiin.Niinpä jotkut profilointilaitteet kärsivät näistä safepoint-ongelmista, kun ne antavat callbackin määritellyille säikeille, näiden säikeiden pitäisi olla safepointissa vastatakseen tuohon callbackiin.Näin ollen se vaikuttaa suorituskykyyn.
Toisaalta jotkut profilointilaitteet käyttävät openJDK:n sisäistä API-kutsua AsyncGetCallTrace (ASGT) helpottaakseen pino-ajonjälkien keräämistä muusta syystä kuin safepointista. AsyncGetCallTrace EI ole JVM:n virallinen API.ASGT:n käyttämiseksi luo ensin JVMTI-agentti.Java Virtual Machine Tool Interface (JVMTI) tarjoaa ohjelmointirajapinnan, jonka avulla sinä, ohjelmistokehittäjä, voit luoda ohjelmistoagentteja, jotka voivat valvoa ja ohjata Java-ohjelmointikielisiä sovelluksiasi.Määritä sitten signaalinkäsittelijä, joka laukaisee signaalin halutulla näytteenottotaajuudella.Tämä signaali ohjataan käynnissä olevalle JVM:lle ja yksi sen käynnissä olevista säikeistä keskeytetään ja kutsutaan takaisin signaalinkäsittelijäämme.Varmista, että keskeytetty säie on käynnissä signaalinkäsittelijässäsi ja kutsu AGCT:tä.Honest-profiloija käyttää tätä ASGT:tä profiloinnin tekemiseen.
Honest-profiloija sisältää kaksi osaa. C++ JVMTI-agentti, joka kirjoittaa tiedoston, joka sisältää kaikki profiloinnin tiedot sovelluksesta, johon jvmti-agentti oli liitetty.Toinen osa, on Java-sovellus, joka tekee profiilin, joka perustuu tähän aiemmin luotuun lokiin.
ASGT-metodi näyttää tältä. AsyncGetCallTrace(ASGCT_CallTrace *trace,jint depth,void* ucontext) .Meidän pitäisi luovuttaa osoitin ASGT-kutsunjälkeen tähän metodiin.
Tämän lähestymistavan ongelmana on se, että saat hieman erilaista dataa kuin tyypillinen Java-pinojälki. Profilerin on käsiteltävä se ja kartoitettava se lähdekoodin riveihin, jotta siitä olisi hyötyä.
Async profiler on matalan overheadin näytteenottoprofiilimittari, joka toimii liittämällä natiivin Java-agentin käynnissä olevaan JVM-prosessiin ja keräämällä pinojäljen näytteet HotSpot-kohtaisia API:ita käyttäen. Async-profiler toimii vain GNU/Linux- ja MacOS-käyttöjärjestelmissä, ja ensin mainituissa se käyttää lisäksi perf_events-tapahtumia myös natiivikoodin tutkimiseen.Yleinen lähestymistapa on perf_events-tapahtumien tuottamien kutsupinojen vastaanottaminen ja niiden yhteensovittaminen AsyncGetCallTrace-tapahtuman tuottamien kutsupinojen kanssa täsmällisen profiilin tuottamiseksi sekä Java- että natiivikoodista. Se käyttää perf_events API:ta CPU-näytteenoton konfiguroimiseen muistipuskuriin ja pyytää signaalin lähettämistä näytteenoton tapahtuessa. Signaalinkäsittelijä kutsuu sitten AGCT:tä ja yhdistää kaksi pinoa yhteen: AGCT:n kaappaaman Java-pinon ja perf_eventsin kaappaaman natiivin + ytimen pinon. Muiden kuin Java-säikeiden osalta säilytetään vain perf_events-pino.
Java Mission Controller(JMC) antaa yksityiskohtaisen raportin kunkin JVM:n jokaisesta yksittäisestä säikeestä ja niiden suorittimen kulutusprosentista tehokkaalla tavalla.Java Mission Control toimii vuorovaikutuksessa JVM:ssä olevan JMX-agentin kanssa, jolla on MBean-palvelin, joka integroituu sisäänrakennettuun VM:ään ja sovelluksen instrumentointiin, joka toimii JVM:ssä. Tämä on keskeinen etu, koska se todella alentaa työkalun yleiskustannuksia, koska se käyttää jo olemassa olevia koukkuja. Oraclen mukaan tämä on yleensä selvästi alle 1 prosentin yleiskustannus. mitään ei tarvitse asentaa tai liittää olemassa olevaan VM:ään, jotta se toimisi. Flight recorderissa on pari lippua, jotka sinun on otettava käyttöön, mutta mitään ei tarvitse asentaa. Käynnistä terminaali, mene JDK bin -hakemistoon ja kirjoita jmc.JMC antaa graafisen käyttöliittymän, joka sisältää käynnissä olevat JVM:t.Valitse JVM-prosessi, jonka haluat profiloida, ja aloita tallennus määrittämällä aikaraja.
Muuten suosittu vaihtoehto on käyttää Linux perf:iä, joka ei suoraan tue Javaa, mutta jolla on loistava tuki natiivikoodin profiloinnille eikä sillä ole vaikeuksia tarkastella myös kernelin pinoja. JVM-tukea varten tarvitsemme perf-kartan, joka kartoittaa JIT-käännetyt osoitteet funktioiden nimiksi (tästä seuraa, että vain käännetyt kehykset ovat tuettuja; tulkin kehykset ovat näkymättömiä)
Ja JIT-kytkimen -XX:+PreserveFramePointer, joka varmistaa, että perf voi kävellä Java-pinossa. Kun käytät tällaista lähestymistapaa,päädyt menettämään tulkkikehyksiä.Et voi profiloida vanhempaa JVM:ää, jossa ei ole PreserveFramePointer-lippua.Perfmapissasi voi olla joitain vanhentuneita merkintöjä, koska JIT voi kääntää koodin uudelleen.Koska JIT heittää osan koodista pois, jotkin toiminnallisuudet voivat päätyä epätarkoituksenmukaiseen toteutukseen.
Näiden lisäksi J2SE (Java 2 Platform Standard Edition) on aina tarjonnut yksinkertaisen komentoriviltä saatavan profilointityökalun nimeltä HPROF, jolla voidaan tehdä heap- ja CPU-profilointia. HPROF on JDK:n sisäänrakennettu työkalu CPU:n ja kasan käytön profilointiin JVM:ssä. HPROF on itse asiassa JVM:n natiivi agenttikirjasto, joka ladataan dynaamisesti komentorivioptiolla JVM:n käynnistyessä, ja siitä tulee osa JVM-prosessia. Käyttäjät voivat pyytää HPROF:ltä erilaisia heap- ja/tai cpu-profilointiominaisuuksia antamalla HPROF:n käynnistyksen yhteydessä HPROF-optioita. Tuotetut tiedot voivat olla teksti- tai binäärimuodossa, ja niitä voidaan käyttää muistin käyttöön ja tehottomaan koodiin liittyvien suorituskykyongelmien jäljittämiseen ja eristämiseen. HPROF:n binäärimuodossa olevaa tiedostoa voidaan käyttää HAT:n kaltaisten työkalujen avulla kasassa olevien allokoitujen objektien selaamiseen.
Johtopäätös
Havaitsemme, että rehellisellä profiloinnilla ja asynkronisella profiloinnilla on voitettu ”safepisteiden kärsimisen” epäkohta openJDK:n sisäisellä API-kutsulla AsyncGetCallTrace.Ne voivat suorittaa profiloinnin paljon pienemmillä yleiskustannuksilla kuin tavalliset profilointityökalut.Mutta ne eivät voi tarjota yksityiskohtaista profilointia säikeistä, jotka ovat erityisiä JVM-prosesseille erikseen.Ne voivat vain tulostaa lokitiedoston/GUI-käyttöliittymän koko säikeiden dumppien joukosta.Toisaalta Java Mission Control voi profiloida säikeet, jotka ovat spesifisiä kullekin prosessille erikseen, jolloin voit seurata kuumia säikeitä ja niiden CPU-käyttöä.Näin ollen JMC on paras vaihtoehto seurata JVM-parametreja paljon yksityiskohtaisemmin.
Viitteet.
Java Virtual Machine Process Status Tool Oracle Documentation.
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
Debuggaus- ja profilointiagentin luominen JVMTI:llä
http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
AsyncGetCallTrace-profiilien hyvät ja huonot puolet
http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html
Näytteenottoon perustuva JVM-profiilintarkkailija ilman safepoint-näytteenottovirheitä.Honest Profiler
https://github.com/jvm-profiling-tools/honest-profiler
Näytteenottoon perustuva CPU- ja HEAP-profiloija Javalle, jossa on AsyncGetCallTrace + perf_events
https://github.com/jvm-profiling-tools/async-profiler