Arthas je alijavin open-source alat za dijagnostiku Jave na produkciji; kroz globalni pregled može da prikaže podatke o stanju memorije, GC-a, niti itd. aplikacije, a omogućava i dijagnostiku poslovnih problema bez izmene koda, uključujući pregled argumenata pri pozivu metoda, vremena izvršenja, steka izuzetaka i sl., što znatno povećava efikasnost pronalaženja problema u produkcionom okruženju.
Jedna misao
We are all in the gutter, but some of us are looking at the stars. (Svi mi živimo u jarku, ali neki od nas gledaju u zvezde) — Oscar Wilde, „Lepeza ledi Vindermir"
Svet je zamućen, a ja jedini čist; svi su pijani, a ja jedini trijezan — Qu Yuan, „Pesme Čua"
Predgovor
Računari su pomalo „glupi", prepoznaju samo 0 i 1, što znači da kod koji napišemo na kraju mora biti preveden u mašinski kod da bi ga računar izvršio. Java je već pri svom nastanku istakla veoma poznatu parolu: „jednom napiši, svuda izvršavaj".
Write Once, Run Anywhere.
Danas ću uzeti nožić i povesti vas da zajedno rassecimo strukturu Java class fajla, odnosno sadržajnu strukturu .class fajla. Iako je on zapravo neprekidni niz bita sastavljen od nula i jedinica, možemo uz pomoć alata jasno sagledati njegovo pravo lice.
Struktura class fajla = struktura .class fajla = Class struktura fajla — ova tri naziva znače istu stvar. „.class" se odnosi na ekstenziju fajla, „Class" posmatrano iz ugla Java klase, a „struktura class fajla" je srpski prevod te pojave.
U prethodnom poglavlju, gde smo objašnjavali kako JVM izvršava Java kod, pomenuo sam da JVM mora da učita kompajlirani fajl bajtkoda u svoju runtime podatkovnu oblast kako bi ga izvršio. Ovaj proces obuhvata mehanizam učitavanja klasa u Javi (znanje koje se često pita na intervjuima), pa ćemo ga detaljno obraditi.
Mnogi kolege koji se bave Java razvojem, iz dana u dan pišu Java kod, a taj rad sigurno ne može bez osnovnog Java okruženja — JDK-a, jer naš Java kod na kraju radi na JVM virtuelnoj mašini.
Uobičajeno je da pre učenja Java-e prvi korak bude instalacija JDK okruženja. To je jednostavno — uglavnom direktno preuzmemo JDK sa zvaničnog sajta, instaliramo, podesimo promenljive okruženja i već veslo možemo da koristimo.
Sećam se da sam 2014. godine, radeći na platformi za trgovinu terminskim ugovorima u velikim količinama, naišao na neke neugodne probleme — verovatno zato što moje znanje o konkurentnom programiranju nije bilo dovoljno čvrsto, što je dovelo do curenja memorije.
Tada sam dugo tražio rešenje; alat koji sam koristio bio je jconsole koji dolazi uz JDK. Nisam ranije imao slično iskustvo sa praćenjem performansi, pa mi je pronalaženje problema bilo veoma bolno i do danas mi je ostalo u snažnom sećanju.
Ranije sam već govorio o praksi pronalaženja i optimizacije OOM-a; danas ću vam ispričati još jednu priču o pronalaženju i optimizaciji problema kada je CPU 100%.
Dobili smo alarm od kolege iz ekipe za održavanje sistema da je opterećenje pojedinih servera veoma visoko, tražeći od nas programera da lociramo problem. Kad sam preuzeo problem, otišao sam prvo na server i video da je od naših aplikacija u radu samo naša Java aplikacija. Zato sam komandom ps dobio PID aplikacije.
- Propusnost (throughput): udeo vremena rada programa u ukupnom vremenu izvršavanja (ukupno vreme = vreme rada programa + vreme sakupljanja smeća); što je vreme sakupljanja smeća kraće, propusnost je veća;
- Vreme pauze (pause time): trajanje STW-a;
- Zauzeće memorije: veličina koju zauzima Java heap.
Za Java zajednicu, sakupljanje smeća je tema koja se ne može zaobići; posao optimizacije na poslu se takođe često vrti oko sakupljača smeća. Pred različitim poslovnim scenarijima, često su potrebni različiti sakupljači smeća da bi se obezbedile GC performanse, zato oni koji žele na intervju u velike kompanije ili imaju visoke ambicije mogu dublje zaći u sakupljače smeća.
