Permanentă zonă de memorie, java

În primul rând, observ că această zonă nu face parte din heapul alocat de -Xmx. Pentru a mări dimensiunea, trebuie să utilizați parametrul -XX: MaxPermSize. Să vedem ce este stocat în acest domeniu și ceea ce poate duce la depășirea lui.






Metadatele despre obiecte

Din punctul de vedere al javai în această zonă sunt aceleași obiecte ca în halda principală. Numai acestea sunt obiecte de anumite tipuri, și anume Clasă, Metodă, Câmp și Constructor. Pot să enumăr câteva motive pentru creșterea numărului de astfel de obiecte.

1. Bibliotecile generează în mod explicit bytecode

Știu cel puțin două biblioteci care pot genera bytecode: acme și cglib. De asemenea, începând cu java 6, acum puteți apela direct compilatorul standard. În general, înainte de a fi posibil să o faceți prin Runtime.getRuntime () Exec (). Dacă generați bytecode neînregistrate și încărcați clase noi, mai devreme sau mai târziu, veți rula în OutOfMemoryError.

2. Folosind java.lang.reflect.Proxy

Această clasă standard JDK generează și încarcă o nouă clasă. Noi numim astfel de clase ca o regulă Proxy $, unde N este un număr întreg.

3. Bibliotecile implicit generatoare de bytecode

Hibernate, Spring, AspectJ și multe alte biblioteci pot genera clase sau pot utiliza proxy dinamic în zbor.

4. API Java Reflection

Evident, când se utilizează Reflecția, se creează obiecte precum câmpul și metoda. care, așa cum am menționat deja, intră în Regiunea Permanentă. Dar nu este deloc evident că după o mai multe referiri la un câmp de clasă prin reflexie sau apel la metoda sa, o nouă clasă este generată și încărcată. Faptul este că, ca o optimizare, pentru a evita căutarea unei schimbări în tabelul în care se află datele câmpurilor, JVM generează clase speciale care accelerează acest proces. Ele sunt de obicei numite GeneratedMethodAccessor, GeneratedFieldAccessor, GeneratedConstructorAccessor unde este un număr întreg. Desigur, acest comportament depinde de implementarea JVM și nu este specificat în nici un fel, dar în acest moment HotSpot JVM o face.






5. Serializarea

Atunci când se utilizează serializarea java standard, se folosește o reflecție. Cu aceasta, JVM citește câmpul serialVersionUID. verifică existența metodei writeObject. caută toate câmpurile din clasă, dacă writeObject nu este suprascris, citește structura părintelui. Sfatul aici este evident: nu folosiți interfața Serializabilă. Cel puțin, uitați-vă la soluția externalizabilă. Deși am preferat recent tampoanele de protocol. ca o soluție mai multi-platformă.

După cum înțelegeți, RMI utilizează în mod serializat serializarea, așa că din nou ne reflectăm cu toate efectele ulterioare.

Class sharing data (CDS)

În java 5 a existat un astfel de lucru ca CDS. Acesta este un fișier de disc care face parte din instalarea JVM, care conține memoria JVM, care conține clasele încărcate care formează nucleul JVM, adică cele care pentru anumite JVM ar trebui încărcate imediat la început. Am o astfel de zonă, se acumulează imediat când mașina de java este inițializată, ceea ce accelerează timpul de începere a aplicației. După cum probabil ați ghicit deja, această zonă intră și în Regiunea Permanentă. De fapt, conține toate aceleași obiecte de clasă, doar pentru a descărca și a șterge memoria, JVM nu mai poate.

Piscină de coarde

Colectarea gunoiului în PermGen

Când vorbim despre colectorul de gunoi, această zonă este adesea menționată ca PermGen. Prin nume, se pare că obiectele create în acest domeniu nu sunt niciodată curățate. Dar nu tot și nu întotdeauna.
De exemplu, un grup de rânduri nu este niciodată șters. De asemenea, în cazul CDS, zona Permanentă este împărțită în două: citire și read-write. Evident, în acest caz, zona de citire nu este curățată de colectorul de gunoi.
Pentru a diagnostica problema încărcării unui număr mare de clase și a verifica dacă sunt încărcate sau nu, puteți utiliza următorii parametri JVM
Pentru a activa / dezactiva descărcarea de clase, puteți utiliza parametrii
Dacă utilizați un colector de gunoi scăzut de pauză (CMS), este de a permite ansamblului la PermGen, trebuie să setați doi parametri (cel puțin în Java 5 A trebuit să fie sigur că pentru a include ambele opțiuni, sau nu funcționează)







Articole similare

Trimiteți-le prietenilor: