yugioh example español collector java garbage-collection java-8

java - example - garbage collector tomcat



¿Cuál es el uso de MetaSpace en Java 8? (3)

Sé que han reemplazado a PermGen con MetaSpace en Java 8. Pero tengo algunas preguntas:

  1. ¿MetaSpace está recolectado por GC de manera predeterminada?
  2. Incluso el PermGen se recopila mediante GC agregando los -XX:+CMSClassUnloadingEnabled como -XX:+CMSClassUnloadingEnabled , entonces ¿qué hace que MetaSpace sea mejor que PermGen?
  3. MetaSpace se basa en la memoria nativa, por lo que mantiene los objetos java en los discos en lugar de en la máquina virtual.
  4. Incluso MetaSpace puede quedarse sin memoria? Si es así, obtendré OutOfMemoryException .
  5. Por defecto, MetaSpace puede crecer en aumento en la memoria?

Gracias por adelantado


¿MetaSpace está recolectado por GC de manera predeterminada?

Sí, GC se ejecutará en el metaespacio cuando se llene, también aumentaría dinámicamente (dado que está permitido) la memoria asignada para los metadatos.

Incluso el PermGen se recopila mediante GC agregando los argumentos como -XX: + CMSClassUnloadingEnabled, entonces ¿qué hace que MetaSpace sea mejor que PermGen?

La mejora es con la expansión dinámica del metaespacio que es algo que Permgen no pudo hacer.

MetaSpace se basa en la memoria nativa, por lo que mantiene los objetos java en los discos en lugar de en la máquina virtual.

Según la descripción de metaspace, solo usa la memoria nativa (sin paginación).

Basado en la investigación de Pierre - Hugues Charbonneau ( enlace aquí ) es claro que la introducción del metaespacio no necesariamente resuelve el problema OOM, es una bandaida al problema en el mejor de los casos, intenta redimensionar dinámicamente la memoria del metaspace para acomodar el crecimiento número de clases que se cargan con un posible efecto secundario de crecimiento incontrolable (siempre que la memoria nativa lo permita).

Podemos lograr el famoso error OOM estableciendo el argumento MaxMetaspaceSize en JVM y ejecutando el programa de ejemplo proporcionado.

muchas gracias a Pierre - Hugues Charbonneau.


  1. ¿MetaSpace está recolectado por GC de manera predeterminada?

    La recolección de basura de las clases muertas y los cargadores de clases se desencadena una vez que el uso de metadatos de clase alcanza el "MaxMetaspaceSize" que por defecto es "unlimited" por lo que se requiere una supervisión adecuada para limitar el retraso o la frecuencia de dicho GC.

  2. Incluso el PermGen se recopila mediante GC agregando los argumentos como -XX: + CMSClassUnloadingEnabled, entonces ¿qué hace que MetaSpace sea mejor que PermGen?

    El objetivo principal es eliminar permgen para que los usuarios no tengan que pensar en dimensionarlo correctamente.

  3. MetaSpace se basa en la memoria nativa, por lo que mantiene los objetos java en los discos en lugar de en la máquina virtual.

    El disco no es una memoria nativa sino un dispositivo de almacenamiento. La memoria nativa, en este contexto es el área, es la memoria para el proceso que queda del montón de Java

  4. Incluso MetaSpace puede quedarse sin memoria?

    Sí, está limitado por la cantidad de memoria en su máquina.


En respuesta:

  1. De forma predeterminada, la memoria de Metaspace se recopila si alcanza MaxMetaspaceSize. Este parámetro es inicialmente ilimitado. El límite es la memoria en su máquina. Pero la memoria se cancela automáticamente cuando ya no se necesita una clase y un cargador de clases. Solo necesita ajustar este parámetro si sospecha que el ClassLoader tiene una pérdida de memoria.

  2. El MetaSpece utiliza memoria nativa y la organización en memoria con punteros hace que el GC sea más rápido que la memoria PermGen anterior.

  3. No, significa que la JVM usa la memoria como un programa C común y no usa el espacio de memoria virtual para objetos java. Parece que la memoria solo está limitada por la máquina. Tenga cuidado de que la memoria de la máquina se pueda cambiar al disco si es necesario.

  4. Si configura el parámetro MaxMetaspaceSize, puede obtener OutOfMemory y, si no establece este parámetro, puede obtener si el proceso asigna toda la memoria de la máquina (incluido el espacio de intercambio).