la memoria en un programa C/C++ / Java se puede asignar en stack o heap.
prerrequisito: diseño de memoria del programa C.
asignación de pila: la asignación ocurre en bloques de memoria contiguos. Lo llamamos una asignación de memoria de pila porque la asignación ocurre en la pila de llamadas de función. El tamaño de la memoria a asignar es conocido por el compilador y cada vez que se llama a una función, sus variables obtienen memoria asignada en la pila. Y cada vez que la llamada a la función ha terminado, la memoria para las variables es desasignada., Todo esto sucede usando algunas rutinas predefinidas en el compilador. Un programador no tiene que preocuparse por la asignación de memoria y la desasignación de variables de pila. Este tipo de asignación de memoria también se conoce como asignación de memoria temporal porque tan pronto como el método termina su ejecución, todos los datos pertenecen a ese método se eliminan automáticamente de la pila. Significa que cualquier valor almacenado en el esquema de memoria de pila es accesible siempre y cuando el método no haya completado su ejecución y esté actualmente en estado de ejecución.,
puntos clave:
- Es un esquema de asignación de memoria temporal donde los miembros de datos son accesibles solo si el método () que los contenía está actualmente en ejecución.
- asigna o desasigna automáticamente la memoria tan pronto como el método correspondiente completa su ejecución.
- recibimos el correspondiente error Java. lang. StackOverFlowError por JVM, si la memoria de la pila se llena completamente.
- La asignación de memoria de pila se considera más segura en comparación con la asignación de memoria de pila porque los datos almacenados solo pueden ser accedidos por el subproceso propietario.,
- La asignación y desasignación de memoria es más rápida en comparación con la asignación de memoria de montón.
- Stack-memory tiene menos espacio de almacenamiento en comparación con Heap-memory.,373″>
int
b;
int
n = 20;
int
c;
}
Heap Allocation: The memory is allocated during the execution of instructions written by programmers., Tenga en cuenta que el nombre heap no tiene nada que ver con la estructura de datos heap. Se llama heap porque es una pila de espacio de memoria disponible para que los programadores asignen y desasignen. Cada vez que creamos un objeto, siempre crea en el espacio de pila y la información de referencia a estos objetos siempre se almacena en la memoria de pila. La asignación de memoria de pila no es tan segura como lo era la asignación de memoria de pila porque los datos almacenados en este espacio son accesibles o visibles para todos los subprocesos. Si un programador no maneja bien esta memoria, puede ocurrir una fuga de memoria en el programa.,
la asignación de memoria de montón se divide en tres categorías: – estas tres categorías nos ayudan a priorizar los datos (objetos) que se almacenan en la memoria de montón o en la recolección de basura.
- Generación Joven – es la porción de la memoria donde todos los nuevos datos (objetos) se hacen para asignar el espacio y siempre que esta memoria está completamente llena, el resto de los datos se almacena en la recolección de basura.,
- generación antigua o permanente – esta es la parte de la memoria de montón que contiene los objetos de datos más antiguos que no están en uso frecuente o que no están en uso en absoluto.
- generación permanente: esta es la parte de la memoria Heap que contiene los metadatos de la JVM para las clases de tiempo de ejecución y los métodos de aplicación.
puntos clave:
- recibimos el mensaje de error correspondiente si Heap-space está completamente lleno, java. lang.OutOfMemoryError por la JVM.,
- este esquema de asignación de memoria es diferente de la asignación de espacio de pila, aquí no se proporciona un futuro de desasignación automática. Necesitamos usar un recolector de basura para eliminar los objetos antiguos no utilizados con el fin de usar la memoria de manera eficiente.
- El tiempo de procesamiento (Tiempo de acceso) de esta memoria es bastante lento en comparación con la memoria de pila.
- Heap-memory tampoco es threaded-safe como Stack-memory porque los datos almacenados en Heap-memory son visibles para todos los subprocesos.
- El Tamaño de la memoria de pila es bastante mayor en comparación con la memoria de pila.,
- Heap-memory es accesible o existe siempre y cuando se ejecute toda la aplicación(o programa java).,iv>
*ptr =
new
int
;
}
Mezclar ejemplo de la clase de asignación de memoria en el Montón y de la Pila en java:
las Siguientes son las conclusiones que vamos a hacer después de analizar el ejemplo anterior:
- Como podemos iniciar la ejecución de el programa, todas las clases de tiempo de ejecución se almacenan en el Montón de espacio de memoria.,
- luego encontramos el método main () en la siguiente línea que se almacena en la pila junto con todo lo que es primitivo(o local) y la variable de referencia Emp del tipo Emp_detail también se almacenará en la pila y señalará el objeto correspondiente almacenado en la memoria del montón.
- Entonces la siguiente línea llamará al constructor parametrizado Emp (int, String) desde main () y también asignará a la parte superior del mismo bloque de memoria de pila. Esto almacenará:
- La referencia de objeto del objeto invocado de la memoria de pila.,
- El valor primitivo(tipo de datos primitivo) int id en la memoria de pila.
- La variable de referencia del argumento String emp_name que apuntará a la cadena real del grupo de cadenas en la memoria del montón.
- Entonces el método main volverá a llamar al método estático Emp_detail (), para el cual la asignación se hará en el bloque de memoria de pila encima del bloque de memoria anterior.
- Por lo tanto, para el objeto recién creado Emp de tipo Emp_detail y todas las variables de instancia se almacenarán en la memoria del montón.
representación pictórica como se muestra en la figura.,1 abajo:
Fig.1
diferencias clave entre las asignaciones de pila y montón
- En una pila, la asignación y la desasignación se realizan automáticamente, mientras que, en montón, debe ser realizada por el programador manualmente.
- El Manejo del marco de pila es más costoso que el manejo del marco de pila.
- El problema de falta de memoria es más probable que ocurra en la pila, mientras que el problema principal en la memoria de montón es la fragmentación.,
- El acceso al marco de pila es más fácil que el marco de montón, ya que la pila tiene una pequeña región de memoria y es amigable con la caché, pero en el caso de los marcos de montón que se dispersan por toda la memoria, por lo que causa más errores de caché.
- Una pila no es flexible, el tamaño de memoria asignado no se puede cambiar mientras que un montón es flexible, y la memoria asignada se puede alterar.
- El Tiempo de acceso al montón es más que una pila.,
Tabla de Comparación
Parámetro | PILA | MONTÓN | |
---|---|---|---|
Basic | la Memoria es asignada en un bloque contiguo. | la memoria se asigna en cualquier orden aleatorio. | |
Asignación y Desasignación | Automática por el compilador de instrucciones. | Manual del programador.,d>Less | More |
Implementation | Hard | Easy | |
Access time | Faster | Slower | |
Main Issue | Shortage of memory | Memory fragmentation | |
Locality of reference | Excellent | Adequate | |
Flexibility | Fixed-size | Resizing is possible | |
Data type structure | Linear | Hierarchical |