Analizând scurgeri de memorie în aplicațiile java folosind visualvm

Memoria scurgerii este o boală și OutOfMemoryError (OOM) este un simptom al acesteia. Dar nu toate OOM-urile indică în mod necesar o scurgere de memorie. OOM poate apărea ca urmare a generării unui număr mare de variabile locale - în special, cu un număr mare de cereri concurente (în cazul unei aplicații server). Pe de altă parte, în mod necesar toate scurgerile de memorie apar ca MOF - mai ales în cazul desktop și aplicații client (cele care nu lucrează pentru o lungă perioadă de timp, fără o repornire).







Scurgerile de memorie pot fi în haldă, zona de memorie folosită pentru a stoca informații meta, memorie nativă.

Următoarele secțiuni vorbesc doar despre scurgeri de memorie din heap. Discutarea despre modul în care puteți determina dacă o scurgere de memorie este cauza OOM în cazul dumneavoastră depășește domeniul de aplicare al acestui articol. Modul de a face față scurgerilor de memorie în zona de memorie folosită pentru a stoca metainformația este, de asemenea, dincolo de scopul acestui articol. Și, cu siguranță, nu am nici o idee cum să fixăm scurgeri de memorie în memoria nativă.

Memorie scurgeri în heap

1) Lansați aplicația. Utilizați cele mai recente JDK disponibile (JDK 1.6 în acest moment). În noile versiuni de java, instrumentele de depanare s-au îmbunătățit semnificativ. Efectuați mai multe acțiuni în aplicația de rulare de mai multe ori pentru a determina care dintre ele duce la o scurgere de memorie.

Analizând scurgeri de memorie în aplicațiile java folosind visualvm

Obțineți starea stabilă a aplicației. Observați mărimea heapului de ceva timp. Dacă dimensiunea "heap după colectarea completă a gunoiului" (plin) crește de fiecare dată, aceasta indică o scurgere de memorie. Și pentru această observație putem folosi VisualVM. Acum am definit operațiunea, rezultând într-o scurgere de memorie - așa că, dacă vom efectua această operațiune de mai multe ori, pentru a primi Oom. (Ce se întâmplă dacă nu am putea determina operația care duce la o scurgere de memorie?) Apoi presupunem că această operație este efectuată în mod continuu.

3) Porniți VisualVM

4) Alăturați-vă aplicației - toate procesele care rulează pe java mașinii virtuale sunt listate în partea stângă (numele clasei principale ar trebui să fie afișat). Puteți face dublu clic pe cel care vă interesează. Există patru file în partea dreaptă - suntem interesați de monitor și profiler.

Analizând scurgeri de memorie în aplicațiile java folosind visualvm

5) Faceți clic pe fila Profiler. Bifați caseta de selectare pentru ca setările să afișeze diferite opțiuni. Faceți clic pe fila Setări de memorie. Selectați "înregistrarea stivei de alocări". Debifați caseta de setări - aceasta va închide panoul cu setările (toate modificările vor fi salvate automat).







Analizând scurgeri de memorie în aplicațiile java folosind visualvm

6) Faceți clic pe butonul "memorie" - începerea profilării memoriei. Așteptați câteva secunde - va dura ceva timp. Se afișează un panou cu file pentru diferite clase și informații despre numărul de instanțe, dimensiunea totală în octeți.

7) Așteptați stabilizarea aplicației.

8) Faceți un instantaneu de obiecte făcând clic pe butonul din partea superioară a panoului cu tab-uri (vedeți captura de ecran). Imaginea rezultată este afișată în partea dreaptă, iar în partea stângă este eticheta acesteia.

Analizând scurgeri de memorie în aplicațiile java folosind visualvm

9) Așteptați un timp pentru a scurge memoria. Faceți o fotografie ca în pasul anterior. Acum avem două poze.

10) Selectați atât instantanee în stânga, cât și clic dreapta și selectați "compara". Fila cu rezultatul comparației ar trebui să apară în partea dreaptă. Această filă afișează elementele pentru care valorile au crescut pentru perioada dintre prima și a doua imagine. Cel mai înalt element este probabil cauza scurgerii memoriei.

Analizând scurgeri de memorie în aplicațiile java folosind visualvm

11) Faceți clic din nou pe fila Profiler. Selectați elementul definit în pasul anterior. Faceți clic pe acesta cu butonul din dreapta al mouse-ului și selectați "Ia instantaneu și afișați urme de stivă de alocare". Este generat încă un instantaneu. De această dată, fila cu următoarea stivă va fi afișată și în partea dreaptă a ferestrei. Ea enumeră diferitele locuri în care acest element este instanțiat, precum și contribuția procentuală la utilizarea generală a memoriei.

Analizând scurgeri de memorie în aplicațiile java folosind visualvm

12) Așteptați câteva pierderi de memorie. Mai faceți câteva fotografii.

13) Obțineți o groapă de gunoi folosită de aplicație. Acest lucru se poate face prin clic-dreapta pe aplicație și selectând "dump heap".

14) Acum, să revenim la fotografiile corespunzătoare cu urme de stive. Comparați cele două instantanee cu stivele de urmărire. Definiți metodele care diferă semnificativ în ceea ce privește contribuția la utilizarea totală a memoriei. Acestea sunt locurile în care instalarea obiectului duce la scurgeri de memorie.

Analizând scurgeri de memorie în aplicațiile java folosind visualvm

15) Mergeți la fila de încărcare a haldei din partea dreaptă. Localizați fereastra Clase. Faceți dublu clic pe elementul definit la pasul 10. Sunt afișate instanțe din această clasă. Alegeți o instanță care credeți că este vinovată de o scurgere de memorie (doar intuiție). Uită-te în partea dreaptă. Deschide fereastra. Veți vedea obiectele care fac trimitere la aceste instanțe. Acesta este motivul pentru scurgeri de memorie.

16) Pe elementele definite la pasul 10 și informațiile obținute în etapele 14 și 15, putem rezolva problema cu scurgeri de memorie. Am găsit obiectul care duce la scurgerea, locul creației sale și obiectele care se referă la ea.







Articole similare

Trimiteți-le prietenilor: