Java.lang.VirtualMachineError este aruncat atunci când o mașină virtuală Java întâlnește orice eroare internă sau limitare a resurselor care îl împiedică să funcționeze. Este un mecanism de auto-apărare folosit de JVM pentru a preveni întreaga aplicație de la crashing. În acest articol, voi discuta despre multe tipuri diferite de VirtualMachineError, caracteristicile lor, diverse motive pentru care sunt declanșate și mai multe soluții potențiale pentru a le remedia.
tipuri de VirtualMachineError
există patru tipuri diferite de VirtualMachineError:
- OutOfMemoryError
- StackOverflowError
- InternalError
- UnknownError
să examinăm aceste tipuri în detaliu în această secțiune.
următoarea generație DEVOPS: managementul fluxului de valori
Helen Beal (Institutul DevOps.)
cum să-ți crești echipa fără server
Sheen Brisals (grupul LEGO)
MLOPS: livrarea continuă a sistemelor de învățare automată
Hauke Brammer (finpair GmbH)
Fig: Ierarhia clasei aruncabile Java
OutOfMemoryError
la fel ca acronimul OMG (Oh, Doamne), Oom (OutOfMemoryError) este destul de popular în rândul comunității DevOps. În timp ce majoritatea inginerilor DevOps ar putea crede că există doar un OutOfMemoryError, există de fapt opt arome diferite de OutOfMemoryError:
- java.lang.OutOfMemoryError: spațiu heap Java
- java.lang.OutOfMemoryError: limita aeriană GC a depășit
- java.lang.OutOfMemoryError: dimensiunea matrice solicitată depășește limita VM
- java.lang.OutOfMemoryError: spațiu Permgen
- java.lang.OutOfMemoryError: Metaspace
- java.lang.OutOfMemoryError: imposibil de creat un nou fir nativ
- java.lang.OutOfMemoryError: Kill proces sau sacrificiu copil
- java.lang.OutOfMemoryError: motiv stack_trace_with_native_method
fiecare eroare este declanșată din motive diferite. În mod similar, soluțiile pentru aceste erori diferă în funcție de tipul de aromă al problemei OutOfMemoryError. Aici este un frumos document de o pagină care rezumă toate tipurile diferite de OutOfMemoryError, cauzele lor, și soluții.
în general, OutOfMemoryError poate fi diagnosticat și fixat prin analizarea jurnalelor de colectare a gunoiului și a haldelor. Deoarece analizarea manuală a jurnalelor de colectare a gunoiului poate fi obositoare, puteți lua în considerare utilizarea instrumentelor gratuite precum GCEASY, HP Jmeter sau IBM GC analyzer. În mod similar, puteți lua în considerare utilizarea instrumentelor gratuite precum HeapHero sau Eclipse MAT pentru a analiza haldele de mormane.
vezi și: StackOverFlowError: Cauze & soluții
StackOverflowError
stiva stivă a unui fir stochează informații despre metodele pe care le execută, valorile primitive ale tipului de date, variabilele locale, indicii obiectului și valorile returnate. Toate aceste lucruri consumă memorie. Dacă dimensiunile stivei unui fir cresc dincolo de limita de memorie alocată, atunci java.lang.StackOverflowError este aruncat. Această problemă se întâmplă de obicei atunci când un fir invocă recursiv aceeași funcție din nou și din nou, din cauza unui bug în programul de executare. Mai multe detalii despre cum să depanați StackOverflowError și toate soluțiile posibile pentru a remedia itc a fi aici.
InternalError
java.lang.InternalError este aruncat de JVM din trei motive. Dacă există o eroare în software-ul care implementează mașina virtuală, o eroare în software-ul sistemului gazdă subiacent sau o eroare în hardware.
cu toate acestea, este rar să întâlnești acest tip de eroare internă. Pentru a înțelege ce scenarii specifice pot cauza InternalError, căutați șirul ‘InternalError’ în baza de date Java bug Oracle. La momentul redactării acestui articol (20 decembrie 2018), există doar 200 de defecte raportate pentru această eroare în baza de date Java bug Oracle. Cele mai multe dintre ele sunt fixe. Deci, nu vă faceți griji prea mult despre asta!
UnknownError
java.lang.UnknownError este aruncat atunci când a apărut o excepție sau o eroare, dar mașina virtuală Java nu este în măsură să raporteze excepția sau eroarea reală. Necunoscutulroarea apare rar. De fapt, atunci când căutați ‘UnknownError’ în Oracle Java Bug database, au fost raportate doar 2 defecte găsite.
VEZI ȘI: Depanare la distanță pentru aplicații Java
caracteristici
VirtualMachineError are câteva caracteristici primare:
- excepții necontrolate
- sincron & livrare asincronă
să discutăm aceste două caracteristici în această secțiune.
excepții necontrolate
există două tipuri de excepții: bifate și debifate.
excepțiile care sunt verificate la momentul compilării se numesc excepții verificate. Dacă unele metode din codul dvs. aruncă o excepție verificată, atunci metoda trebuie fie să gestioneze excepția, fie trebuie să specifice excepția folosind cuvântul cheie ‘aruncă’. Exemple de excepții verificate sunt: IOException, SQLException, DataAccessException, ClassNotFoundException și multe altele.
excepțiile necontrolate nu au această cerință. Nu trebuie să fie prinși sau declarați aruncați. Toate tipurile de VirtualMachineError sunt excepții necontrolate.
sincron & livrare asincron
excepțiile pot fi aruncate în două moduri: sincron și asincron.
excepțiile sincrone se întâmplă la o declarație de program specifică, indiferent de câte ori programul a fost executat într-un mediu similar. Exemple de excepții sincrone sunt lucruri precum NullPointerException, ArrayIndexOutOfBoundException etc.
excepțiile asincrone se pot întâmpla în orice moment și în orice parte a declarației programului. Nu există nici o consistență în cazul în care acesta poate fi aruncat. Toate Virtualeerorile mașinii sunt aruncate asincron, dar uneori pot fi aruncate și sincron. StackOverflowError poate fi aruncat sincron prin invocarea metodei, precum și asincron din cauza execuției metodei native sau a limitărilor resurselor mașinii virtuale Java. În mod similar, OutOfMemoryError poate fi aruncat sincron în timpul creării obiectului, crearea matricei, inițializarea clasei și conversia boxului, precum și asincron.