En Java, gestión de la memoria es un proceso vital. Java lo gestiona automáticamente. La JVM divide la memoria en dos partes: pila memoria y memoria de montón. Desde la perspectiva de Java, ambas son áreas de memoria importantes pero ambas se utilizan para diferentes propósitos. El Gran diferencia entre la memoria de pila y la memoria de montón. es que la pila se usa para almacenar el orden de ejecución del método y las variables locales, mientras que la memoria del montón almacena los objetos y usa la asignación y desasignación de memoria dinámica. En esta sección, discutiremos en detalle las diferencias entre pila y montón.
Memoria de pila
La memoria de la pila es un espacio físico (en RAM) asignado a cada subproceso en tiempo de ejecución. Se crea cuando se crea un hilo. La gestión de la memoria en la pila sigue el orden LIFO (último en entrar, primero en salir) porque es accesible globalmente. Almacena las variables, referencias a objetos y resultados parciales. La memoria asignada a la pila vive hasta que regresa la función. Si no hay espacio para crear los nuevos objetos, arroja eljava.lang.StackOverFlowError. El alcance de los elementos se limita a sus hilos. El JVM crea una pila separada para cada hilo.
Memoria del montón
Se crea cuando se inicia la JVM y la aplicación lo utiliza mientras se ejecuta. Almacena objetos y clases JRE. Cada vez que creamos objetos, ocupa espacio en la memoria del montón mientras que la referencia de ese objeto se crea en la pila. No sigue ningún orden como la pila. Maneja dinámicamente los bloques de memoria. Es decir, no necesitamos manejar la memoria manualmente. Para gestionar la memoria automáticamente, Java proporciona el recolector de basura que elimina los objetos que ya no se utilizan. La memoria asignada al montón vive hasta que no se produzca ningún evento, ya sea que el programa finalice o que se libere la memoria. Los elementos son accesibles globalmente en la aplicación. Es un espacio de memoria común compartido con todos los hilos. Si el espacio del montón está lleno, arroja eljava.lang.OutOfMemoryError. La memoria del montón se divide a su vez en las siguientes áreas de memoria:
- Generación joven
- Espacio de supervivientes
- vieja generacion
- Generación permanente
- Caché de código
La siguiente imagen muestra la asignación de memoria de pila y espacio de montón.
Diferencia entre memoria de pila y de montón
La siguiente tabla resume las principales diferencias entre la memoria de pila y el espacio de pila.
Parámetro | Memoria de pila | Espacio de almacenamiento dinámico |
---|---|---|
Solicitud | Almacena artículos que tienen una vida muy corta como métodos, variables, y variables de referencia de los objetos. | almacena objetos y entorno de ejecución Java ( JRE ) clases. |
Realizar pedidos | Sigue el LIFO orden. | No sigue ningún orden porque es una asignación de memoria dinámica y no tiene ningún patrón fijo para la asignación y desasignación de bloques de memoria. |
Flexibilidad | Es no flexible porque no podemos alterar la memoria asignada. | Es flexible porque podemos alterar la memoria asignada. |
Eficiencia | Tiene más rápido acceso, asignación y desasignación. | Tiene Más lento acceso, asignación y desasignación. |
Tamaño de la memoria | Es menor en tamaño. | Es más grande en tamaño. |
Opciones de Java utilizadas | Podemos aumentar el tamaño de la pila usando la opción JVM -Xss. | Podemos aumentar o disminuir el tamaño de la memoria dinámica utilizando las opciones -Xmx y -Xms JVM. |
Visibilidad o alcance | Las variables son visibles sólo para el hilo propietario. | Es visible para todos los hilos. |
Generación del espacio | Cuando se crea un hilo, el sistema operativo asigna automáticamente la pila. | Para crear el espacio dinámico para la aplicación, el lenguaje primero llama al sistema operativo en tiempo de ejecución. |
Distribución | Se crea una pila separada para cada objeto. | Se comparte entre todos los hilos. |
Lanzamientos de excepción | JVM lanza el java.lang.StackOverFlowError si el tamaño de la pila es mayor que el límite. Para evitar este error, aumente el tamaño de la pila. | JVM lanza el java.lang.OutOfMemoryError si la JVM no puede crear un nuevo método nativo. |
Asignación/desasignación | Se hace automáticamente por el compilador . | Se hace manualmente por el programador . |
Costo | Su costo es menos . | Su costo es más en comparación con la pila. |
Implementación | Su implementación es duro . | Su implementación es fácil . |
Orden de asignación | La asignación de memoria es continuo . | Memoria asignada en aleatorio orden. |
Seguridad de subprocesos | Es seguro para subprocesos porque cada subproceso tiene su propia pila. | No es seguro para subprocesos, por lo que se requiere una sincronización adecuada del código. |