Java.lang.VirtualMachineError est levée lorsqu’une machine virtuelle Java rencontre une erreur interne ou une limitation de ressources qui l’empêche de fonctionner. C’est un mécanisme d’autodéfense utilisé par la JVM pour empêcher toute l’application de se bloquer. Dans cet article, je vais discuter des différents types de VirtualMachineError, de leurs caractéristiques, des différentes raisons pour lesquelles ils sont déclenchés et de plusieurs solutions potentielles pour les corriger.
Types de VirtualMachineError
Il existe quatre types différents de VirtualMachineError:
- OutOfMemoryError
- StackOverflowError
- InternalError
- UnknownError
Examinons ces types en détail dans cette section.
DEVOPS DE NOUVELLE GÉNÉRATION : GESTION DES FLUX DE VALEUR
Helen Beal (Institut DevOps.)
COMMENT DÉVELOPPER VOTRE ÉQUIPE SANS SERVEUR
Sheen Brisals (Le groupe LEGO)
MLOPS : LIVRAISON CONTINUE DE SYSTÈMES D’APPRENTISSAGE AUTOMATIQUE
Hauke Brammer (finpair GmbH)
Fig: Hiérarchie de classes Java throwable
OutOfMemoryError
Tout comme l’acronyme OMG (Oh My God), OOM (OutOfMemoryError) est très populaire parmi la communauté DevOps. Alors que la plupart des ingénieurs DevOps peuvent penser qu’il n’y a qu’une seule OutOfMemoryError, il existe en fait huit versions différentes d’OutOfMemoryError:
- java.lang.OutOfMemoryError: Espace de tas Java
- java.lang.OutOfMemoryError: Limite de surcharge GC dépassée
- java.lang.OutOfMemoryError : La taille du tableau demandé dépasse la limite de la machine virtuelle
- java.lang.Dans le cas d’une erreur de mémoire externe, l’espace de Permgen
- java.lang.Dans le cas d’une erreur de mémoire, il s’agit d’un Métaspace
- java.lang.OutOfMemoryError : Impossible de créer un nouveau thread natif
- java.lang.OutOfMemoryError: Tuer le processus ou sacrifier l’enfant
- java.lang.OutOfMemoryError: reason stack_trace_with_native_method
Chaque erreur est déclenchée par des raisons différentes. De même, les solutions à ces erreurs diffèrent en fonction du type de saveur du problème OutOfMemoryError. Voici un beau document d’une page qui résume tous les différents types d’OutOfMemoryError, leurs causes et leurs solutions.
En général, OutOfMemoryError peut être diagnostiqué et corrigé en analysant les journaux de collecte des ordures et les décharges de tas. Étant donné que l’analyse manuelle des journaux de collecte des ordures peut être fastidieuse, vous pouvez envisager d’utiliser des outils gratuits tels que GCeasy, HP Jmeter ou IBM GC analyzer. De même, vous pouvez envisager d’utiliser des outils gratuits comme HeapHero ou Eclipse MAT pour analyser les décharges de tas.
VOIR AUSSI : StackOverFlowError: Causes & solutions
StackOverflowError
La pile d’un thread stocke des informations sur les méthodes qu’il exécute, les valeurs de type de données primitives, les variables locales, les pointeurs d’objets et les valeurs de retour. Toutes ces choses consomment de la mémoire. Si la taille de la pile d’un thread dépasse la limite de mémoire allouée, alors java.lang.StackOverflowError est levée. Ce problème se produit généralement lorsqu’un thread invoque récursivement la même fonction encore et encore à cause d’un bogue dans le programme en cours d’exécution. Plus de détails sur la façon de déboguer StackOverflowError et toutes les solutions possibles pour corriger itc et être ici.
Erreur interne
java.lang.InternalError est lancé par la JVM pour trois raisons. S’il y a un défaut dans le logiciel implémentant la machine virtuelle, un défaut dans le logiciel du système hôte sous-jacent ou un défaut dans le matériel.
Cependant, il est rare de rencontrer ce genre d’erreur interne. Pour comprendre quels scénarios spécifiques peuvent provoquer InternalError, recherchez la chaîne ‘InternalError’ dans la base de données de bogues Java d’Oracle. Au moment de la rédaction de cet article (20 décembre 2018), il n’y avait que 200 défauts signalés pour cette erreur dans la base de données de bogues Java d’Oracle. La plupart d’entre eux sont fixes. Alors, ne vous inquiétez pas trop pour celui-ci!
UnknownError
java.lang.UnknownError est levée lorsqu’une exception ou une erreur s’est produite, mais la machine virtuelle Java n’est pas en mesure de signaler l’exception ou l’erreur réelle. L’inconnue se produit rarement. En fait, lors de la recherche de ‘UnknownError’ dans la base de données de bogues Oracle Java, seuls 2 défauts ont été signalés.
VOIR AUSSI: Débogage à distance pour les applications Java
Caractéristiques
VirtualMachineError a deux caractéristiques principales:
- Exceptions non cochées
- Synchrone & livraison asynchrone
Discutons de ces deux caractéristiques dans cette section.
Exceptions non cochées
Il existe deux types d’exceptions : cochées et non cochées.
Les exceptions vérifiées au moment de la compilation sont appelées Exceptions vérifiées. Si certaines méthodes de votre code lancent une exception vérifiée, la méthode doit soit gérer l’exception, soit spécifier l’exception à l’aide du mot clé ‘throws’. Des exemples d’exceptions vérifiées sont : IOException, SQLException, DataAccessException, ClassNotFoundException, etc.
Les exceptions non cochées n’ont pas cette exigence. Ils n’ont pas à être attrapés ou déclarés jetés. Tous les types de VirtualMachineError sont des exceptions non cochées.
Synchrone & distribution asynchrone
Les exceptions peuvent être lancées dans deux modes : synchrone et asynchrone.
Les exceptions synchrones se produisent à une instruction de programme spécifique, quel que soit le nombre de fois où le programme a été exécuté dans un environnement similaire. Des exemples d’exceptions synchrones sont des choses comme NullPointerException, ArrayIndexOutOfBoundException, etc.
Des exceptions asynchrones peuvent se produire à tout moment et dans n’importe quelle partie de l’instruction du programme. Il n’y a pas de cohérence où il peut être lancé. Toutes les erreurs VirtualMachineErrors sont lancées de manière asynchrone, mais parfois elles peuvent également être lancées de manière synchrone. StackOverflowError peut être levée de manière synchrone par appel de méthode, ainsi que de manière asynchrone en raison de l’exécution de la méthode native ou des limitations de ressources de machine virtuelle Java. De même, OutOfMemoryError peut être lancé de manière synchrone lors de la création d’objets, de la création de tableaux, de l’initialisation de classes et de la conversion de boxe, ainsi que de manière asynchrone.