Come risolvere un VirtualMachineError in Java

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:

  1. OutOfMemoryError
  2. StackOverflowError
  3. InternalError
  4. UnknownError

esaminare questi tipi di in dettaglio in questa sezione.

    JAX Londra
    JAX Londra 2019

    Emily Lannon

    la PROSSIMA GENERAZIONE di DEVOPS: GESTIONE del FLUSSO di VALORE

    Helen Beal (DevOps Istituto.)

    Emily Lannon

    COME far CRESCERE la TUA SERVERLESS TEAM

    Sheen Brisals (Il Gruppo LEGO)

    Emily Lannon

    MLOPS: CONTINUA la CONSEGNA DELLA MACCHINA, SISTEMI di APPRENDIMENTO

    Hauke Brammer (finpair GmbH)

VirtualMachineError

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Previous post Consulenza afro-americana
Next post Gli schizofrenici sono pericolosi?