Diagnosticul outofmemoryerror improvizat mijloace

Unul dintre colegii mei este un adept al filosofiei „setări implicite“. Această filozofie pledează pentru următoarea abordare: nu încercați să schimbe mediul pentru a se potrivi nevoilor dumneavoastră - trebuie doar să învețe cum să utilizeze environment'om standardul.

În ciuda faptului că, prin ea însăși această abordare este destul de controversată, ea are plusuri sale. Abilitatea de a rezolva probleme prin mijloace regulate ajuta mai ales atunci când aveți nevoie pentru a diagnostica rapid orice problemă și nu aveți environment'a meu personalizat. De exemplu, lucrați temporar pentru o altă mașină, sau punct de vedere geografic la distanță din inima ta dulce, environment'a perfect reglat. De aceea, consider că este foarte important să fie capabil de a diagnostica o problemă de situații tipice folosind doar utilități full-time. Așa că hai să vedem cum putem diagnostica leak'i de memorie în Java, atunci când aveți la îndemână, nu este nimic altceva decât JDK.

Deci, în jurnalele găsiți o OutOfMemoryError. Ce să fac? În primul rând, este necesar să se înțeleagă ce să nu facă. În orice caz, nu este necesar pentru a reporni procesul. Făcând acest lucru vei pierde aplicațiile heap întregi, iar în acest caz, heap - este singura bucată de dovezi pe care le poate atinge pe cauzele Oom. Trebuie să faci groapa de heap. Acest lucru va ajuta să înțelegeți care ia memoria, precum și de ce memoria nu a fost eliberat în mod specific gunoi collector'om.

Cel mai simplu mod de a face o groapa - este folosit utilitatea jmap a JDK.

Acum, când ai făcut Halda, puteți rula cu ușurință înapoi sistemul la viață și a reporni JVM, dacă este necesar.

Dump, înainte de livrarea la mașina dvs. sfătui să-l prindeți, Huddle grămadă la fel de bine dump'y. Când groapa de gunoi este o întrebare pe masina ta. Și cum înțeleg că au „nu în interiorul“?

Cu cea mai recentă versiune a JDK vine de aplicare VisualVM. care conține inclusiv profiler de memorie. Încărcați halda în VisualVM și deschide fila „clase“.

Diagnosticul outofmemoryerror improvizat mijloace

În această contribuție vom vedea de alocare de memorie în dump'e de clasa de obiecte. În acest caz, mai multă memorie întregul char [] tip. Se pare că cineva păstrează o mulțime de linii în memorie. Cine este?

Faceți dublu clic pe clasă și trece în vizualizarea instanță. Aici vedem toate cazurile de acest tip, precum și cine se face referire, precum și investigarea și de ce nu au ridica GC. Vezi mai multe copii.

Diagnosticul outofmemoryerror improvizat mijloace

În cazul meu, de cele mai multe referiri la șirul de date de bază H2 a avut loc prin utilizarea de referință moale. Un pic de Googling poate fi constatat că H2 folosește o referință moale pentru cache-ul bazei de date. O trăsătură distinctivă a referințelor moi este că JVM le va colecta doar atunci când rămâne fără memorie (generația MOF înainte). Acest lucru face ca link-uri moale mecanism destul de convenabil pentru toate tipurile de cache-uri. Cu toate acestea, JVM nu garantează că va avea timp pentru a colecta toate link-urile moi înainte de a genera exception'a. Ceea ce pare să se întâmple în cazul meu.

De asemenea, demn de remarcat este faptul că VisualVM se poate găsi cea mai apropiată rădăcină GC, care deține instanța de collector'a gunoi.

Diagnosticul outofmemoryerror improvizat mijloace

Acest lucru vă salvează de la a fi nevoie să sari de pe un copac referent'ov Saiga în căutarea celui mai apropiat rădăcină GC.

Uneori se întâmplă că cauza OutOfMemoryError nu este suficientă memorie, și din alte motive. De exemplu, în cazul în care JVM vede că ea își petrece cea mai mare parte a timpului CPU pentru colectarea gunoiului, dar nu pe performanța reală a cererii, aceasta generează următoarea excepție.

În funcție de modul în care cererea este scris poate rămâne în viață, și chiar să continue să îndeplinească funcțiile sale. Și, după o grămadă de câteva minute poate fi curată și fără exces de reziduuri (GC mâncat în cunoștință de cauză atât de mult timp CPU și în cele din urmă a colectat tot gunoiul).

Debugging este dificil - nu aveți heap'a, deși frunzele de ceai pentru a ghici. În acest caz, este necesar să reporniți aplicația cu -XX cheie: -HeapDumpOnOutOfMemoryError. Acest lucru va determina JVM pentru a face o grămadă arunce automat înainte de a arunca în OOM'om aplicarea deficitară. După un alt astfel de incident, veți avea hrană pentru gândire.

statisticile runtime

De asemenea, puteți calcula cu ușurință memoria totală ocupată de un anumit tip de ambalaj.

Pentru a fi cu tine puterea de setări implicite.

articole similare