En todos los lenguajes de programación, la memoria es un recurso vital y también escasea por naturaleza. Por lo tanto, es esencial que la memoria se administre a fondo sin fugas. En este artículo, entenderemos qué es el metaespacio y en qué se diferencia de permgen.
Antes de comprender el metaespacio, primero comprendamos la estructura de la memoria JVM.
Estructura de memoria JVM :
JVM define varias áreas de datos en tiempo de ejecución que se utilizan durante la ejecución de un programa. Algunas de las áreas son creadas por la JVM, mientras que otras son creadas por los subprocesos que se utilizan en un programa. Sin embargo, el área de memoria creada por JVM se destruye solo cuando se cierra la JVM. Las áreas de datos del subproceso se crean durante la creación de instancias y se destruyen cuando el subproceso sale. La estructura de memoria de JVM se divide en múltiples áreas de memoria, como área de montón, área de pila, área de método, registros de PC, etc. La siguiente imagen ilustra las diferentes áreas de memoria en Java:
Aquí, el área de montón es una de las áreas de memoria más importantes de JVM. Aquí se almacenan todos los objetos Java . El montón se crea cuando se inicia la JVM. El montón generalmente se divide en dos partes. Eso es:
- Young Generation(Nursery): Todos los objetos nuevos se ubican en esta memoria. Cada vez que se llena esta memoria, se realiza la recolección de basura . A esto se le llama Recolección de Basura Menor .
- Generación antigua: todos los objetos de larga duración que han sobrevivido a muchas rondas de recolección de basura menor se almacenan en esta área. Cada vez que se llena esta memoria, se realiza la recolección de basura. A esto se le llama Recolección Mayor de Basura .
Además de la memoria del montón, JVM también contiene otro tipo de memoria que se denomina Generación permanente o «PermGen».
Memoria PermGen: este es un espacio especial en el montón de Java que está separado de la memoria principal donde se almacena todo el contenido estático en esta sección. Aparte de eso, esta memoria también almacena los metadatos de la aplicación requeridos por la JVM. Los metadatos son datos que se utilizan para describir los datos. Aquí, la recolección de basura también ocurre como cualquier otra parte de la memoria. El grupo de strings también formaba parte de esta memoria antes de Java 7. El área de métodos es una parte del espacio en PermGen y se usa para almacenar la estructura de clases y el código para métodos y constructores. La mayor desventaja de PermGen es que contiene un tamaño limitado que conduce a un OutOfMemoryError. El tamaño predeterminado de la memoria PermGen es de 64 MB en la JVM de 32 bits y de 82 MB en la versión de 64 bits. Debido a esto, JVM tuvo que cambiar el tamaño de esta memoria al realizar con frecuencia la recolección de basura, que es una operación costosa. Java también permite cambiar manualmente el tamaño de la memoria PermGen. Sin embargo, no se puede hacer que el espacio PermGen aumente automáticamente. Por lo tanto, es difícil ajustarlo. Y también, el recolector de basura no es lo suficientemente eficiente para limpiar la memoria.
Debido a los problemas anteriores, PermGen se eliminó por completo en Java 8. En lugar de PermGen, se introdujo una nueva característica llamada Meta Space. MetaSpace crece automáticamente por defecto. Aquí, la recolección de elementos no utilizados se activa automáticamente cuando el uso de metadatos de la clase alcanza su tamaño máximo de metaespacio.
La siguiente tabla describe la diferencia entre metaspace y PermGen:
PermGen | MetaEspacio |
---|---|
Se elimina de java 8. | Se introduce en Java 8. |
PermGen siempre tiene un tamaño máximo fijo. | Metaspace por defecto automáticamente aumenta su tamaño dependiendo del sistema operativo subyacente. |
Memoria de pila Java contigua. | Memoria nativa (proporcionada por el sistema operativo subyacente). |
Recolección de basura ineficiente. | Recolección de basura eficiente. |
Publicación traducida automáticamente
Artículo escrito por subhasis mohanty y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA