Optimización de Memoria en Java: Estructuras Estáticas vs. Dinámicas y Pilas
Clasificado en Informática
Escrito el en español con un tamaño de 3,89 KB
Manejo de Memoria
Las estructuras de datos donde el tamaño de memoria asignado no se puede modificar se conocen como estructuras de datos manejadas por memoria estática (arreglos). Al contrario, las estructuras de datos donde el tamaño de memoria asignado se modifica en tiempo de ejecución se conocen como estructuras de datos manejadas por memoria dinámica.
Manejo de Memoria Estática
La memoria estática utiliza almacenamiento contiguo, esto quiere decir que un elemento de la estructura de datos que utiliza este tipo de almacenamiento está de forma contigua con el siguiente elemento.
Manejo de Memoria Dinámica
La memoria dinámica, a diferencia de la estática, permite que las estructuras de datos aumenten su tamaño a medida que lo requieren y solo utilizan el espacio requerido por los datos que tienen en un momento dado. Java provee mecanismos para utilizar este tipo de memoria.
Para utilizar memoria dinámica necesitamos recurrir al uso de apuntadores o referencias; en el caso de Java, se utilizan las referencias.
Se pueden observar diferencias al usar memoria dinámica y memoria estática. Al encadenar los datos, estos se dice que están dispersos en la memoria, existiendo ventajas y desventajas de cada una de ellas. Para este caso, podríamos mencionar algunas:
- a) Al encadenar los datos no necesitamos reservar un espacio grande de memoria.
- b) Cuando se utiliza memoria estática, se requiere un índice que nos ayude a saber cuántos elementos tiene la estructura de datos; con memoria dinámica, no.
- c) Al utilizar memoria dinámica, es necesario que todos los elementos tengan al menos un dato adicional que se utilizará como campo de enlace con otro dato de la estructura de datos.
Pilas
En la representación lógica, los datos pueden ser de cualquier tipo, incluyendo los definidos por el programador (clases). Cuando hablamos de representación, hablamos de cómo se puede representar esta estructura de datos. Si hablamos de almacenamiento estático, podemos hacer referencia a un arreglo e información adicional que se requiere de acuerdo con el comportamiento que esta estructura de datos debe tener.
Una pila tiene un fondo que indica cuál es la posición al final de la pila y un tope que indica cuál es el principio de la pila (Stack Pointer SP). El comportamiento de una pila indica que cualquier elemento se debe ir al fondo de la pila para poderlos ir apilando así hasta que la pila se llene, indicando que existe un elemento en el tope. Para poder sacar un elemento, este debe ser el primer elemento dentro de la pila. Por ejemplo, si deseamos agregar un elemento a la pila, debemos saber si existe espacio en la pila y después agregarlo en el lugar que le corresponde. A esta operación se le llama PUSH (meter). La pila funciona como un sistema: el primero que entra es el último en salir o el último en entrar es el primero en salir. La operación de sacar también se le llama POP.
Una pila llena indica que no se pueden agregar más elementos. Cuando esto ocurre y se intenta agregar un elemento, se dice que ocurre un sobre flujo sobre la pila (Stack Overflow).
Las operaciones que se pueden hacer con una pila se pueden resumir como se describe a continuación:
- Crear la pila.
- Agregar un elemento a la pila (PUSH).
- Eliminar un elemento de la pila (POP).
- Verificar si la pila está vacía (ISFREE).
- Verificar si la pila está llena (ISFULL).
Una vez que se ha mostrado la forma en que opera una pila y la forma de representarla con almacenamiento estático y dinámico, definiremos la abstracción con una interfaz:
public interface pila { void push(Object d); Object pop(); boolean ISFREE(); boolean ISFULL(); }