Cómo arreglar un error de máquina virtual en Java

Java.lang.VirtualMachineError se genera cuando una máquina virtual Java encuentra algún error interno o limitación de recursos que le impide funcionar. Es un mecanismo de autodefensa empleado por la JVM para evitar que se bloquee toda la aplicación. En este artículo, analizaré los muchos tipos diferentes de VirtualMachineError, sus características, varias razones por las que se activan y varias soluciones potenciales para solucionarlos.

Tipos de VirtualMachineError

Hay cuatro tipos diferentes de VirtualMachineError:

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

Vamos a revisar estos tipos en detalle en esta sección.

    JAX London
    JAX London 2019

    Emily Lannon

    DEVOPS DE PRÓXIMA GENERACIÓN: GESTIÓN DE FLUJOS DE VALOR

    Helen Beal (Instituto DevOps.)

    Emily Lannon

    CÓMO hacer CRECER SU SERVERLESS EQUIPO

    Brillo Brisals (The LEGO Group)

    Emily Lannon

    MLOPS: CONTINUA la ENTREGA de SISTEMAS DE APRENDIZAJE automático

    Hauke Brammer (finpair GmbH)

VirtualMachineError

Fig: Jerarquía de clases Java lanzable

OutOfMemoryError

Al igual que el acrónimo OMG (Oh Dios mío), OOM (OutOfMemoryError) es bastante popular entre la comunidad de DevOps. Mientras que la mayoría de DevOps ingenieros puede pensar que no es sólo un OutOfMemoryError, en realidad, hay ocho diferentes sabores de OutOfMemoryError:

  • java.lang.OutOfMemoryError: Espacio de montón de Java
  • java.lang.Error fuera de memoria: Se superó el límite de sobrecarga de GC
  • java.lang.Error OutOfMemoryError: El tamaño de matriz solicitado excede el límite de VM
  • java.lang.OutOfMemoryError: Espacio Permgen
  • java.lang.Error OutOfMemoryError: Metaspace
  • java.lang.OutOfMemoryError: No se puede crear un nuevo hilo nativo
  • java.lang.OutOfMemoryError: Kill process or sacrifice child
  • java.lang.OutOfMemoryError: reason stack_trace_with_native_method

Cada error se activa por diferentes razones. Del mismo modo, las soluciones para estos errores difieren en función del tipo de problema de error OutOfMemoryError que sea. Aquí es un hermoso documento de una página que resume todos los diferentes tipos de OutOfMemoryError, sus causas y soluciones.

En general, OutOfMemoryError se puede diagnosticar y corregir mediante el análisis de registros de Recolección de basura y Volcados de pilas. Dado que analizar manualmente los registros de recolección de basura puede ser tedioso, puede considerar el uso de herramientas gratuitas como GCeasy, HP Jmeter o IBM GC analyzer. Del mismo modo, puede considerar el uso de herramientas gratuitas como HeapHero o Eclipse MAT para analizar volcados de pilas.

VER TAMBIÉN: StackOverflowError: Causas & soluciones

StackOverflowError

La pila de pila de un hilo almacena información sobre los métodos que ejecuta, valores de tipo de datos primitivos, variables locales, punteros de objetos y valores devueltos. Todas estas cosas consumen memoria. Si los tamaños de pila de un hilo crecen más allá del límite de memoria asignado, entonces java.lang.StackOverflowError es lanzado. Este problema suele ocurrir cuando un subproceso invoca recursivamente la misma función una y otra vez debido a un error en el programa en ejecución. Más detalles sobre cómo depurar StackOverflowError y todas las soluciones posibles para arreglar itc y be aquí.

Error interno

java.lang.El error interno es lanzado por JVM por tres razones. Si hay un error en el software que implementa la máquina virtual, un error en el software del sistema host subyacente o un error en el hardware.

Sin embargo, es raro encontrar este tipo de error interno. Para comprender qué escenarios específicos pueden causar errores internos, busque la cadena ‘Errores internos’ en la base de datos de errores Java de Oracle. En el momento de escribir este artículo (20 de diciembre de 2018), solo hay 200 defectos reportados por este error en la base de datos de errores Java de Oracle. La mayoría de ellos son fijos. Por lo tanto, no se preocupe demasiado por este!

Error desconocido

java.lang.UnknownError se genera cuando se ha producido una excepción o error, pero la máquina virtual Java no puede informar de la excepción o error real. El error desconocido rara vez ocurre. De hecho, al buscar ‘Error desconocido’ en la base de datos de errores de Oracle Java, solo se encontraron 2 defectos reportados.

VÉASE TAMBIÉN: Depuración remota para aplicaciones Java

Características

VirtualMachineError tiene un par de características principales:

  • Excepciones sin marcar
  • Síncrono & Entrega asíncrona

Analicemos estas dos características en esta sección.

Excepciones sin marcar

Hay dos tipos de excepciones: marcadas y sin marcar.

Las excepciones que se comprueban en tiempo de compilación se denominan Excepción comprobada. Si algunos métodos en su código lanzan una excepción marcada, entonces el método debe manejar la excepción o debe especificar la excepción usando la palabra clave ‘lanza’. Ejemplos de excepciones marcadas son: IOException, SQLException, DataAccessException, ClassNotFoundException y más.

Las excepciones sin marcar no tienen este requisito. No tienen que ser capturados o declarados arrojados. Todos los tipos de VirtualMachineError son excepciones sin marcar.

Síncrono & Entrega asíncrona

Las excepciones se pueden lanzar en dos modos: síncrono y asíncrono.

Las excepciones sincrónicas ocurren en una instrucción de programa específica, sin importar cuántas veces se haya ejecutado el programa en un entorno similar. Ejemplos de excepciones sincrónicas son cosas como NullPointerException, ArrayIndexOutOfBoundException, etc.

Las excepciones asíncronas pueden ocurrir en cualquier momento y en cualquier parte de la instrucción del programa. No hay consistencia donde se puede lanzar. Todos los errores de máquina virtual se lanzan de forma asincrónica, pero a veces también se pueden lanzar de forma sincrónica. StackOverflowError se puede lanzar de forma sincrónica por invocación de métodos, así como de forma asincrónica debido a la ejecución de métodos nativos o a limitaciones de recursos de máquinas virtuales Java. Del mismo modo, OutOfMemoryError puede lanzarse de forma sincrónica durante la creación de objetos, la creación de matrices, la inicialización de clases y la conversión de cajas, así como de forma asincrónica.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Previous post Asesoramiento afroamericano
Next post ¿Son Peligrosos los Esquizofrénicos?