Java.lang.VirtualMachineError viene generato quando una macchina virtuale Java incontra un errore interno o una limitazione delle risorse che ne impedisce il funzionamento. È un meccanismo di autodifesa impiegato dalla JVM per impedire l’arresto anomalo dell’intera applicazione. In questo articolo, discuterò i diversi tipi di VirtualMachineError, le loro caratteristiche, i vari motivi per cui vengono attivati e diverse soluzioni potenziali per risolverli.
Tipi di VirtualMachineError
Ci sono quattro diversi tipi di VirtualMachineError:
- OutOfMemoryError
- StackOverflowError
- InternalError
- UnknownError
esaminare questi tipi di in dettaglio in questa sezione.
la PROSSIMA GENERAZIONE di DEVOPS: GESTIONE del FLUSSO di VALORE
Helen Beal (DevOps Istituto.)
COME far CRESCERE la TUA SERVERLESS TEAM
Sheen Brisals (Il Gruppo LEGO)
MLOPS: CONTINUA la CONSEGNA DELLA MACCHINA, SISTEMI di APPRENDIMENTO
Hauke Brammer (finpair GmbH)
Fig: Java throwable class hierarchy
OutOfMemoryError
Proprio come l’acronimo OMG (Oh My God), OOM (OutOfMemoryError) è molto popolare tra la comunità DevOps. Mentre la maggior parte degli ingegneri DevOps potrebbe pensare che ci sia solo un OutOfMemoryError, in realtà ci sono otto diversi gusti di OutOfMemoryError:
- java.lang.OutOfMemoryError: spazio heap Java
- java.lang.OutOfMemoryError: GC Overhead limite superato
- java.lang.OutOfMemoryError: la dimensione dell’array richiesta supera il limite VM
- java.lang.OutOfMemoryError: Permgen spazio
- java.lang.OutOfMemoryError: Metaspace
- java.lang.OutOfMemoryError: Impossibile creare un nuovo thread nativo
- java.lang.OutOfMemoryError: Uccidi il processo o sacrifichi il bambino
- java.lang.OutOfMemoryError: reason stack_trace_with_native_method
Ogni errore viene attivato da motivi diversi. Allo stesso modo, le soluzioni per questi errori differiscono in base al tipo di sapore del problema di OutOfMemoryError. Ecco un bellissimo documento di una pagina che riassume tutti i diversi tipi di OutOfMemoryError, le loro cause e soluzioni.
In generale, OutOfMemoryError può essere diagnosticato e risolto analizzando i log di Garbage Collection e i dump Heap. Poiché l’analisi manuale dei registri di Garbage Collection può essere noiosa, puoi considerare l’utilizzo di strumenti gratuiti come GCeasy, HP Jmeter o IBM GC analyzer. Allo stesso modo, puoi considerare l’utilizzo di strumenti gratuiti come HeapHero o Eclipse MAT per analizzare i dump di heap.
VEDI ANCHE: StackOverFlowError: Cause & soluzioni
StackOverflowError
Lo stack stack di un thread memorizza informazioni sui metodi eseguiti, sui valori primitivi del tipo di dati, sulle variabili locali, sui puntatori di oggetti e sui valori di ritorno. Tutte queste cose consumano memoria. Se le dimensioni dello stack di un thread crescono oltre il limite di memoria allocata, quindi java.lang.StackOverflowError viene lanciato. Questo problema si verifica in genere quando un thread richiama ricorsivamente la stessa funzione più e più volte a causa di un bug nel programma in esecuzione. Maggiori dettagli su come eseguire il debug di StackOverflowError e tutte le possibili soluzioni per risolvere itc e essere qui.
InternalError
java.lang.InternalError viene lanciato da JVM per tre motivi. Se è presente un errore nel software che implementa la macchina virtuale, un errore nel software del sistema host sottostante o un errore nell’hardware.
Tuttavia, è raro incontrare questo tipo di InternalError. Per capire quali scenari specifici possono causare InternalError, cercare la stringa ‘InternalError’ nel database di bug Java di Oracle. Al momento della stesura di questo articolo (20 dicembre 2018), ci sono solo 200 difetti segnalati per questo errore nel database di bug Java di Oracle. La maggior parte di loro sono fissi. Quindi, non preoccuparti troppo di questo!
UnknownError
java.lang.UnknownError viene generato quando si è verificata un’eccezione o un errore, ma la macchina virtuale Java non è in grado di segnalare l’eccezione o l’errore effettivo. Il UnknownError si verifica raramente. Infatti, durante la ricerca di’ UnknownError ‘ in Oracle Java Bug database, ci sono stati solo 2 difetti trovati segnalati.
VEDI ANCHE: Il debug remoto per applicazioni Java
Caratteristiche
VirtualMachineError ha un paio di caratteristiche primarie:
- eccezioni Unchecked
- Sincrono & asincrona
Cerchiamo di discutere di queste due caratteristiche in questa sezione.
Eccezioni deselezionate
Esistono due tipi di eccezioni: selezionate e deselezionate.
Le eccezioni controllate in fase di compilazione sono chiamate Eccezione controllata. Se alcuni metodi nel codice generano un’eccezione selezionata, il metodo deve gestire l’eccezione o deve specificare l’eccezione utilizzando la parola chiave ‘throws’. Esempi delle eccezioni controllate sono: IOException, SQLException, DataAccessException, ClassNotFoundException e altro ancora.
Le eccezioni non selezionate non hanno questo requisito. Non devono essere catturati o dichiarati gettati. Tutti i tipi di VirtualMachineError sono eccezioni deselezionate.
Sincrono &consegna asincrona
Le eccezioni possono essere generate in due modalità: sincrona e asincrona.
Le eccezioni sincrone si verificano in una specifica istruzione del programma, indipendentemente dal numero di volte in cui il programma è stato eseguito in un ambiente simile. Esempi di eccezioni sincrone sono cose come NullPointerException, ArrayIndexOutOfBoundException, ecc.
Le eccezioni asincrone possono verificarsi in qualsiasi momento e in qualsiasi parte dell’istruzione del programma. Non c’è coerenza dove può essere lanciato. Tutti i VirtualMachineErrors vengono lanciati in modo asincrono, ma a volte possono anche essere lanciati in modo sincrono. StackOverflowError può essere generato in modo sincrono tramite l’invocazione del metodo, nonché in modo asincrono a causa dell’esecuzione del metodo nativo o delle limitazioni delle risorse della macchina virtuale Java. Allo stesso modo, OutOfMemoryError può essere generato in modo sincrono durante la creazione di oggetti, la creazione di array, l’inizializzazione di classe e la conversione di boxe, nonché in modo asincrono.