Cinci secrete

Despre această serie de articole

Crezi că știi totul despre programarea Java? De fapt, majoritatea dezvoltatorilor curăță doar suprafața platformei Java, studiind-o suficient pentru a-și face treaba. În această serie de articole, Ted Neward intră în funcționalitatea platformei Java, dezvăluind fapte puțin cunoscute care pot ajuta la rezolvarea celor mai bizare sarcini de programare.

JVM este un cărucior care oferă funcționalitatea și performanța aplicațiilor Java și pe care majoritatea dezvoltatorilor Java le acceptă. Și foarte puțini oameni înțeleg cu adevărat cum JVM face ceea ce face ea - lucruri cum ar fi distribuirea de obiecte și de colectare a gunoiului, fluxul de implementare, deschiderea și închiderea de fișiere, interpretarea și / sau-JIT compila codul Java byte, și multe altele.

Ignorarea JVM este scumpă din punctul de vedere al performanței aplicației, iar atunci când ceva nu merge bine, poate complica foarte mult încercările de corectare a situației.

1. DisableExplicitGC

Dezvoltați abilități pe această temă

Acest material face parte din calea cunoașterii pentru dezvoltarea abilităților tale. Consultați Deveniți programator Java

Nu pot spune de câte ori mi-a fost cerut să mă consult cu privire la problema performanței aplicațiilor, un greșit rapid al codului a arătat ceea ce este prezentat în Lista 1 - clasicul anti-model al performanței Java.

Listarea 1. System.gc ();

Cu toate acestea, pentru a rezolva această problemă specială, inginerii Sun ne-au furnizat un pavilion JVM special. Drapelul -XX: + DisableExplicitGC transformă automat System.gc () apel în nici-op, oferindu-dezvoltator capacitatea de a rula cod și verificați dacă ajută System.gc () de performanță de funcționare sau rănirea JVM ca un întreg.

IBM JVM pe aceeași funcție, care este disponibil pe JVM bazat pe tehnologia HotSpot, poate fi realizată cu ajutorul echipei -Xdisableexplicitgc rezultat.

2. HeapDumpOnOutOfMemoryError

Ați experimentat vreodată zilele în care JVM se înclină, emise mesaje OutOfMemoryError. și nu puteți obține depanatorul să prindă cauza? Astfel de probleme sporadice sau non-deterministe pot conduce un dezvoltator nebun.

Fii atent

Nu toate steagurile de linie de comandă sunt în mod necesar susținute de VM, cu excepția cazului în care acestea provin de la Sun / Oracle. Cea mai bună modalitate de a afla dacă steagul este susținut, desigur, este să-l încercați și să vedeți dacă acesta funcționează. Cu toate acestea, dacă aceste steaguri nu sunt suportate tehnic, sunteți pe deplin responsabil pentru utilizarea lor. Nici eu, Sun / Oracle, nici IBM® nu va fi responsabil pentru faptul că, în urma aplicării oricăruia dintre aceste steaguri, codul, datele, serverul sau mama ta s-au evaporat. Ca o precauție, vă sfătuiesc să le verificați mai întâi într-un mediu virtual (non-producție).

În astfel de cazuri, trebuie să ia un instantaneu al haldei chiar în momentul în care JVM emite spiritul - și asta e ceea ce face ca o echipă -XX: + HeapDumpOnOutOfMemoryError.

Pentru aceasta echipa face JVM „instantaneu groapa de haldă“ și salvează-l într-un fișier pentru prelucrare ulterioară, în mod tipic de utilitate jhat (pe care am introdus într-un articol anterior). Calea prin care va fi salvat acest fișier poate fi specificată cu pavilionul -XX: HeapDumpPath corespunzător. (Ori de câte ori este stocat acest fișier, asigurați-vă că sistemul de fișiere și / sau procesul Java are configurația necesară de permisiune pentru ao scrie acolo).

În motorul dump IBM JVM, această caracteristică este activată în mod prestabilit, asigurându-se că heapdump-ul este obținut cu OutOfMemoryError. Mecanismul de stocare IBM oferă un număr de opțiuni de configurare, inclusiv blocarea stocării, prin opțiunile din linia de comandă -Xdump.

3. bootclasspath

Este util să direcționați periodic o clasă de-a lungul căii de clasă, care este puțin diferită de cea care vine cu JRE, sau oarecum extinde JRE. (Un exemplu este noul furnizor de Java API Crypto). Dacă doriți să extindeți JRE, atunci implementarea dvs. specială trebuie să fie disponibilă pentru încărcătorul ClassLoader. care încarcă java.lang.Object și toți colegii săi în rt.jar.

Deși puteți să deschideți rt.jar și să introduceți o implementare specială sau un nou pachet, tehnic ar fi o încălcare a licenței, pe care ați convenit să o descărcați pe JDK.

În schimb, utilizați parametrul personalizat JVM - Xbootclasspath și congenerii acestuia - Xbootclasspath / p și -Xbootclasspath / a.

-Xbootclasspath vă permite să specificați calea completă la calea de clasă, care ar trebui să includă în mod normal o referință la rt.jar. plus o grămadă de alte fișiere JAR care fac parte din JDK și nu fac parte din rt.jar. -Xbootclasspath / p pune valoarea la începutul variabilei bootclasspath existente și -Xbootclasspath / a - la sfârșit.

Dacă, de exemplu, ați modificat arrayul java.lang.Integer și ați făcut modificări în subdirectorul mods. parametrul -Xbootclasspath / a mods va pune o nouă valoare Integer înainte de valoarea implicită.

4. verbose

-verbose este un utilitar de diagnosticare de nivel înalt pentru aplicații Java de aproape orice tip. Acest steag are trei sub-steaguri: gc. clasa și jni.

gc devine, de obicei, primul lucru la care apelează dezvoltatorii pentru a încerca să afle dacă colectorul de gunoi JVM este în sus și dacă aceasta este cauza unor performanțe scăzute. Din păcate, interpretarea gc de ieșire poate fi dificilă - atât de mult încât să poți scrie cărți întregi despre asta. Mai rău, datele afișate pe linia de comandă pot varia de la o versiune Java la alta sau de la un JVM la altul, ceea ce complică și mai mult interpretarea corectă.

În general vorbind, în cazul în care colectorul de gunoi se bazează pe conceptul de „generații de obiecte“ (cum ar fi în VM «enterprise-class“ majoritate), sau că un steag vizibil va indica GC completă alezajului; În JVM Sun, acest steag arată ca [Full GC. ] la începutul șirului de ieșire GC.

clasa poate fi un bug atunci când încercați să diagnosticați un ClassLoader sau atunci când apar conflicte de nepotrivire de clasă. Aceasta indică nu numai timpul de încărcare al clasei, ci și locația din care a fost încărcată, inclusiv calea spre fișierul JAR, dacă a venit din JAR.

jni este utilă numai atunci când lucrează cu JNI și cu propriile biblioteci. Când este activată, raportează diverse evenimente JNI, cum ar fi momentul în care propriile biblioteci sunt încărcate și legăturile de metodă; din nou, rezultatul poate varia de la o eliberare la alta sau de la un JVM la altul.

5. Linia de comandă -X

Am enumerat câteva dintre opțiunile de linie de comandă preferate oferite de JVM, dar există o mulțime de ele, astfel încât cititorul ar trebui să facă propriile sale cercetări. Rularea argumentului liniei de comandă -X are ca rezultat enumerarea tuturor argumentelor non-standard (dar în cea mai mare măsură sigure) pe care JVM le oferă - de exemplu:

  • -Xint. care execută JVM în modul de interpretare (acest lucru poate fi util pentru a verifica dacă compilatorul JIT are un efect asupra codului și dacă are erori);
  • -Xloggc. care face același lucru cu -verbose: gc. dar înregistrează evenimente într-un fișier și nu le aruncă în fereastra de comandă.

Opțiunile liniei de comandă JVM se modifică din când în când, deci este util să le revizuiți periodic. Acest lucru poate depinde de faptul că va trebui să te uiți la monitorul târziu, sau vei veni acasă la ora 17 și vei putea lua cina împreună cu soția și copiii tăi (sau vei ucide dușmanii în Mass Effect 2, în funcție de ceea ce îți place).

În IBM JVM, se dorește ieșirea rezultatelor verbose: gc la un fișier utilizând parametrul -Xverbosegclog. care vă permite, de asemenea, să creați o specificație a fișierului jurnal.

concluzie

steaguri linia de comandă care nu sunt destinate utilizării continue în mediile de producție - de fapt, în plus față de steagurile pe care (probabil) ajunge folosind pentru a configura JVM colector de gunoi, nici unul dintre non-standard indicatorii de linie de comandă care nu sunt destinate utilizării producției. Dar ele sunt neprețuite ca mijloc de a privi în interiorul unei mașini virtuale care, în alte cazuri, este complet opacă.

Următorul în ciclul Cinci secrete .... Instrumente Java pentru fiecare zi.

Descărcați resurse

Subiecte conexe

Articole similare