Al prepararse para las entrevistas con desarrolladores de Java, comprender cómo se organiza la memoria dentro de la Máquina virtual Java (JVM) puede ser un tema clave de discusión. Esta publicación resaltará las diferentes áreas de memoria en la JVM, específicamente Stack, Heap y MetaSpace, proporcionando puntos esenciales en los que los entrevistadores pueden centrarse. Al familiarizarse con estos conceptos, podrá mejorar su preparación para la entrevista y demostrar su comprensión de la gestión de la memoria Java.
Las funciones de JDK, JRE y JVM
Antes de sumergirnos directamente en los espacios de memoria de JVM, exploremos rápidamente la conexión entre el Java Development Kit (JDK), Java Runtime Environment (JRE) y Java. Máquina virtual (JVM) e identificar dónde encaja exactamente la JVM dentro de este marco.
Con esta comprensión, ahora podemos centrar nuestra atención en las áreas de memoria de la JVM, específicamente Stack, Heap y MetaSpace, para ver cómo se organiza la memoria durante la ejecución de aplicaciones Java.
1. Memoria de pila
Qué se almacena en la memoria de pila:
-
Llamadas a métodos: cada vez que se invoca un método, se inserta un nuevo marco en la pila, que incluye:
-
Parámetros del método: Los argumentos pasados al método.
-
Variables locales: Variables declaradas dentro del método. Esto incluye:
-
Tipos de datos primitivos: Los valores reales de las variables locales declaradas como tipos primitivos se almacenan directamente en la pila.
-
Referencias a objetos: para las variables locales que son de tipos de objetos, solo las referencias a los objetos reales (que residen en la memoria dinámica) se almacenan en la pila.
-
Dirección de retorno: la dirección a la que regresar después de que se complete la ejecución del método.
Información adicional sobre la memoria de pila:
-
Asignación y desasignación de memoria: la memoria para un método se asigna cuando se llama al método y se desasigna cuando finaliza la ejecución.
-
Seguridad de subprocesos: cada subproceso en Java tiene su propia memoria de pila, lo que garantiza que las variables locales sean seguras para subprocesos.
-
Tamaño limitado: la memoria de pila generalmente tiene un tamaño limitado, lo que puede provocar errores de desbordamiento de pila si se realizan demasiadas llamadas a métodos (por ejemplo, en caso de recursividad profunda).
2. Memoria del montón
Qué se almacena en la memoria del montón:
-
Objetos: solo los objetos se almacenan en la memoria del montón. Esto incluye:
-
Objetos de clase definidos por el usuario: Instancias creadas a partir de clases definidas por el usuario.
-
Objetos de clase integrados: instancias de las clases integradas de Java, incluidas matrices y clases de colección como ArrayList, HashMap, etc.
-
Variables de instancia: como campos no estáticos que pertenecen a un objeto, las variables de instancia se almacenan junto con el objeto en el montón.
-
String Pool: un área especial en el montón que almacena cadenas literales. Si se crea un literal de cadena, Java verifica primero el grupo de cadenas; si existe, se devuelve la referencia al objeto existente en lugar de crear un nuevo objeto.
Información adicional sobre la memoria dinámica:
-
Asignación de memoria: la memoria se asigna cuando se crea un objeto y el recolector de basura la desasigna cuando ya no se puede acceder al objeto.
-
Recolección de basura: el recolector de basura administra automáticamente la memoria en el montón identificando y eliminando objetos a los que ya no se puede acceder o que ya no son necesarios.
-
Memoria compartida: la memoria del montón se comparte entre todos los subprocesos, lo que permite la comunicación entre subprocesos. Otros subprocesos pueden acceder, modificar o hacer referencia a los objetos creados por un subproceso. Esto requiere el uso de técnicas de multiproceso para gestionar el acceso a objetos compartidos, garantizando la coherencia de los datos y evitando condiciones de carrera.
3. Área de método / MetaSpace
El área de método también se conoce como MetaSpace en Java 8 y versiones posteriores.
Qué se almacena en el área de método/MetaSpace:
-
Metadatos de clase: la información sobre las clases, como su estructura (campos, métodos e interfaces) y las relaciones con otras clases, se almacena en MetaSpace.
-
Variables estáticas: los campos estáticos declarados en clases se almacenan en MetaSpace, haciéndolos accesibles a todas las instancias de esa clase.
-
Grupo constante de tiempo de ejecución: Este grupo contiene literales y referencias utilizadas durante el tiempo de ejecución. Para los literales de cadena, las referencias se almacenan aquí (los valores reales se almacenan en String Pool en el montón), mientras que otros literales (como numéricos y booleanos) se almacenan directamente como valores.
Información adicional sobre el área del método/MetaSpace:
-
Memoria compartida: el área de método se comparte entre todos los subprocesos, lo que significa que solo existe una instancia de MetaSpace dentro de la JVM. Esto permite una gestión eficiente de la información de la clase y reduce la sobrecarga de memoria.
-
Sincronización: La JVM maneja la sincronización al acceder al Área de métodos para evitar inconsistencias y garantizar la seguridad de los subprocesos.
Conclusión
Comprender estas tres áreas de memoria es crucial para cualquier desarrollador de Java. Forman la base de conceptos importantes como recolección de basura, pérdida de memoria y seguridad de subprocesos, que se analizarán en los próximos artículos de esta serie.
Publicaciones relacionadas
¡Feliz codificación!