You are on page 1of 35

La memoria de la computadora

El rea completa de la figura 1 representa la memoria de


una computadora, incluyendo el rea a la derecha que
parece una escalera. Todo el cdigo ejecutable y todas
las variables de un programa dado se almacenan dentro
del rea ilustrada en la figura, la pregunta es, Cmo se
almacenan los diversos elementos en ste espacio?

Existen tres reas de memoria que tienen facultades


especiales asignadas por el compilador y el
enlazador, stas son:

Stack: El rea que semeja una escalera en la parte


derecha del diagrama es el stack. El stack est
asignado por el sistema a un tamao fijo y se rellena
conforme se necesita de la parte inferior a la
superior, un elemento a la vez. Los elementos se
remueven de la parte superior a la parte inferior, un
elemento a la vez, o sea, el ltimo elemento
agregado es el primer elemento eliminado cuando ya
no sea necesario.

Heap: Esta es el rea en el diagrama identificada


con el nombre heap, es asignada por el sistema a un
tamao fijo y la utiliza el mismo conforme sea
necesario en una forma aleatoria, esto no significa
que exista un cierto desorden en la manera en que la
memoria es utilizada, significa que la memoria no se
asigna en un orden particular. De hecho, puede ser
asignada en bloques conforme sea necesario en
cualquier lugar dentro del heap. Cualquier memoria
dentro del heap que no est actualmente asignada
para utilizarse por el programa es almacenada en
una "lista libre", esto es, bloques de memoria en
espera de asignacin.

Memoria global: Es la memoria en la mquina que


no est asignada al stack al heap.
Cmo se asigna la memoria global?
Tanto el bloque de cdigo main ( ) del programa
como las funciones requeridas por el mismo se
almacenan en algn lugar de la memoria global.
Aunque el sistema asignar los diversos bloques de
cdigo en una forma ordenada, asumiremos que no
son asignados en un orden particular, de hecho,
deberamos suponer que los bloques son asignados
aleatoriamente por toda el rea de almacenamiento
global y que cualquier funcin particular no est
contigua a otra.

Variables globales
De inters especial son los pequeos bloques de la
parte superior de la figura 1 porque representan
variables globales, las cuales se almacenan en el
espacio global, el sistema reserva suficiente
memoria para almacenar la variable en cuestin y
asigna tal memoria para la variable. La variable
global existe durante toda la vida del programa en
ejecucin.

Variables globales
Observe que una variable de tipo char por lo general
utiliza slo un byte de almacenamiento, en cambio
una variable double utilizar 8 bytes de
almacenamiento, por lo tanto, la caja etiquetada
como variable puede almacenar un tipo char, int,
double o cualquier otra variable simple y el sistema
garantiza el suficiente espacio para almacenar la
entidad solicitada, aunque en el diagrama las cajas
son del mismo tamao, en la memoria fsica de la
computadora tendrn tamaos variables.

Un puntero global
La caja etiquetada puntero tiene la habilidad de
almacenar punteros de cualquier tipo. Los punteros
generalmente son del mismo tamao para todos los tipos
de datos en una determinada combinacin de hardware y
sistema operativo, por lo que probablemente se les
asigne la misma cantidad de bytes. El punto es una
convencin para representar grficamente a los
punteros, y cuando no incluye una flecha como en la
figura, el puntero no ha sido asignado para sealar algo
en particular, de hecho puede contener un valor
indeterminado aunque por definicin, un puntero global
es inicializado automticamente a NULL. Cualquier
nmero de punteros y variables pueden ser almacenados
en la memoria global hasta el lmite fsico de la memoria
disponible.

Cmo se utiliza el stack?


Cuando las variables los punteros son requeridos
por
el
sistema,
stos
sern
asignados
secuencialmente al stack empezando por la parte
inferior siendo cada elemento sucesivo "apilado"
(encimado) en el anterior. Cada caja en el diagrama
representa un espacio de almacenamiento para una
variable dada de la misma manera que se describi
para la memoria global, el sistema se encarga de
determinar la cantidad precisa de bytes necesarios
para una variable dada, sin embargo, cuando un
programa no necesita ms la variable almacenada
en stack, el espacio ocupado debe ser liberado para
permitir que otros programas utilicen el espacio
disponible.

Piense en el stack como un vaso con agua,


conforme vamos requiriendo espacio de stack,
vamos llenando el vaso, conforme liberamos espacio
del stack, vamos vaciando de agua el vaso. El vaso
por supuesto tiene un lmite, el stack tambin.

Cmo se utiliza el heap?


El heap es un bloque contiguo de memoria que est
disponible para utilizarse por cualquier parte del
programa siempre que sea necesario. Cuando un
programa solicita un bloque de datos, el esquema de
asignacin dinmica sustrae un bloque del heap y lo
asigna al usuario retornando un puntero que seala
al principio del bloque. Cuando el sistema termina de
utilizar el bloque, lo regresa al heap donde a su vez
es colocado en la pila de memoria disponible
llamada la lista libre. A esto se le llama
desasignacin.

MANEJO DE MEMORIA EN JAVA


Conceptos
La memoria est dividida en tres partes, Zona de
Datos, Stack y Heap.
Zona de Datos
La Zona de Datos es donde guardamos las
instrucciones del programa, las clases, los mtodos,
y las constantes(es decir, todos los final), esta parte
de la memoria es totalmente fija, y nada durante el
tiempo ejecucin lo puede cambiar.

Stack
El Stack, podra imaginarse como si fuese un Array,
que es de tamao fijo durante el tiempo ejecucin del
programa, en tiempo de compilacin es cuando se
define el tamao que tendr. En concreto se guardan
dos tipos de elementos, las referencias a objetos(o
instancias) y datos de tipo primitivo(int, float, char),
se
almacenan
las
variables
locales,
parmetros/valores de retorno de los mtodos, etc.
Por ejemplo, si ejecutamos un mtodo, las variables
locales de ese mtodo se guardaran en el Stack, y
al finalizar el mtodo, se borran del Stack, pero hay
que tener en cuenta que el Stack es fijo, y solamente
estaramos usando y dejando de usar una parte del

Stack, y por esa misma caracterstica de ser


esttico, si lo llenamos, caeramos en un
StackOverflowError. Esto es muy raro que suceda,
algo como un mtodo recursivo mal controlado sera
un ejemplo del error.
Heap
El Heap, esta es la zona de la memoria dinmica,
los objetos son creados, eliminados o modificados en
esta parte de la memoria, la Java Virtual Machine
(desde ahora, la JVM), le asigna un espacio
predeterminado de memoria, pero al necesitar ms
memoria, la JVM le solicita al sistema operativo la
memoria necesitada, y segn se vaya requiriendo, la
JVM le seguir proporcionando ms memoria.

Como interactan el Heap y el Stack


Como ya se coment arriba el Stack guarda
referencias y datos primitivos, las referencias pueden
apuntar a elementos del heap (es decir, a los
objetos), las referencias tienen un tipo, que es al tipo
de objeto que pueden apuntar las referencias,
vindolo de otra manera, que est determinado por
la clase de la que se crear a la instancia, y puede
apuntar a esa clase o subclases (elementos que
hereden de la clase), el stack es fijo, y los tipos de
referencias no pueden cambiar.

Un ejemplo prctico:

En la tercera lnea, se crea la referencia en el stack,


en la cuarta lnea se crea el objeto en el heap y en el
mismo momento hacemos la referencia desde el
stack.

Grficamente
representarlo:

esta

sera

una

manera

Otro cdigo y su representacin grfica:

de

Primero creamos la referencia, luego el objeto,


hacemos que la referencia apunte hacia l, luego
creamos otro objeto y hacemos que la referencia
ahora apunte hacia el nuevo objeto.

Algo que sera bueno comentar, es que la relacin


referencia-objeto es de muchos a uno, es decir, un
objeto puede estar siendo apuntado por muchas
referencias, pero una referencia solo apunta a un
objeto.

Garbage Collection
Cada vez que cree un objeto voy a tener memoria en
uso, as podramos llenar el heap, incluso podramos
llegar a tener un OutOfMemoryException(cosa muy
rara, claro que pasara si nos quedamos sin memoria,
y si no la sabemos utilizar, peor el asunto), para eso
necesitamos borrar los objetos que no tengan
referencias, que queden perdidos en memoria, en el
lenguaje de programacin C, la liberacin de
memoria va por parte del programador, cuidando los
objetos que no se utilizan y eliminarlos manualmente,
pero Java tiene el Garbage Collector, que no es mas
que un proceso de la JVM que est revisando qu
objetos pueden ser borrados y cuales no.

Pero cmo la JVM sabe que objetos deben


borrarse? Sencillo, si los objetos estn perdidos en
memoria, no tienen referencias, y por lo tanto no se
pueden accesar, esos son los candidatos a ser
borrados, en la siguiente pasada del GC.
El GC es un proceso de baja prioridad, por lo que no
se pasa en todo momento liberando memoria, si no
que pasa de vez en cuando, que podra ser en un
tiempo muerto del procesador, aunque tambin
nosotros podramos sugerirle que pase, pero va a
pasar cuando pueda y quiera, un par de ejemplos de
como mandarlo llamar son estos.

Un ejemplo de GC
Vamos a analizar este cdigo lnea por lnea:

Lnea 3. Se crea el primer objeto en el heap, se crea


la primera referencia en el stack, y la referencia
apunta al objeto.

Lnea 4. Se crea el segundo objeto en el heap, se


crea la segunda referencia en el stack, y la referencia
apunta al objeto.
Lnea 5. La primera referencia apunta hacia el
segundo objeto. En este momento el primer objeto se
queda sin referencia, es desechado por el GC, y se
libera memoria.
Lnea 6. La segunda referencia, apunta a nada.

LISTAS ENLAZADAS
Listas
Una lista en su sentido amplio, es un conjunto de elementos del
mismo tipo donde cada elemento tiene un nico predecesor (excepto
el primero) y un nico sucesor (excepto el ltimo) y cuyo nmero de
elementos es variable.
S = {a, b, c, d,. . . z}
Ejemplo: Una lista de letras
Operaciones
Entre las operaciones permitidas estn:
Verificar si es vaca.
Insertar, eliminar o localizar un elemento.
Determinar el tamao de la lista.
Etc.
En fin, una lista podra tener todo tipo de operaciones que le permitan
ser manipulada como un arreglo por ejemplo.

LISTAS ENLAZADAS
1. Simples (con enlace simple)
2. Dobles (doblemente enlazadas)
.
.

Existe diversas implementaciones de estas


estructuras.
Las variaciones mas comunes implementan
listas circulares y listas con cabecera en sus dos
variaciones (simples y dobles)

En lenguajes donde no se cuenta con memoria


dinmica, las listas se implementan usando
arreglos.
informacin
0

enlace

Pan

-1

Galletas

Jamn

Leche

inicio

2
3
4
5
6
7

El arreglo contiene dos


campos: uno para la
informacin y otro para
relacionar al siguiente
elemento.
La lista se recorre desde
el inicio y hasta encontrar
un elemento que contenga
un enlace vaco.

LISTAS
Una lista es una coleccin lineal de elementos llamados nodos
donde el orden de los mismos se establece mediante punteros o
referencias y existe un puntero/referencia especial llamado inicio
para localizar al primer elemento.
Ejemplos:
inicio

*Lista enlazada de 0 elementos


Informacin enlace

inicio
* Lista enlazada de 4
elementos

Los nodos de las listas


Un nodo se divide en 2 partes:
Informacin: Contiene la informacin del elemento.
Enlace: Contiene la direccin del siguiente nodo de la
lista.
informacin enlace

Nodo

public class Nodo{


// atributos
public String informacion;
public Nodo enlace;
// el constructor de nodos
Nodo (String n){
informacion = n;
enlace = null;
}
}

Almacenamiento de datos:
1. Arreglos: La relacin lineal esta implcita en la
relacin fsica de los elementos. Desventaja:
Almacenamiento esttico y tamao fijo.
2. Elementos enlazados: Agrega a cada elemento un
campo de enlace, no requieren almacenamiento
contiguo en memoria, se pueden aadir y borrar
elementos fcilmente.

Listas Simples
Coleccin lineal de elementos llamados nodos.
Existe un elemento llamado inicio que apunta al
primer elemento de la lista.
Cada nodo contiene un campo de enlace que apunta
al siguiente elemento.
El ltimo elemento de la lista en su campo enlace
apunta a nulo.
Al principio el apuntador inicio apunta a nulo.

Operaciones con listas simples

Insertar: Agrega un elemento a la lista.


Eliminar: Retira un elemento de la lista.
Buscar: Busca un elemento en la lista.
Recorrer: Visita todos los elementos de la lista.
Vaca: Indica si la lista contiene o no elementos.
Tamao: Indica el nmero de elementos de la lista.

Con las operaciones anteriores, define una interfase


para una lista simple que contiene datos de tipo
String.

public interface ILista{


public void insertar(String elemento);
public boolean eliminar(String elemento);
public String eliminar();
public boolean buscar(String elemento);
public String recorrer();
public boolean vaca();
public int tamao();

LISTA LIGADA SIMPLE


Una lista enlazada es una de las estructuras de datos
fundamentales, y puede ser usada para implementar
otras estructuras de datos. Consiste en una secuencia
de nodos, en los que se guardan campos de datos
arbitrarios y una o dos referencias (punteros) al nodo
anterior o posterior. El principal beneficio de las listas
enlazadas respecto a los array convencionales es que
el orden de los elementos enlazados puede ser
diferente al orden de almacenamiento en la memoria
o el disco, permitiendo que el orden de recorrido de
la lista sea diferente al de almacenamiento.

LISTA LIGADA SIMPLE

Existen diferentes tipos de listas enlazadas: Lista


Enlazadas Simples, Listas Doblemente Enlazadas,
Listas Enlazadas Circulares y Listas Enlazadas
Doblemente Circulares.
Aplicaciones de las listas enlazadas
Las listas enlazadas son usadas como mdulos para otras
estructuras de datos, tales como pilas, colas y sus variaciones.
El campo de datos de un nodo puede ser otra lista enlazada.
Mediante este mecanismo, se pueden construir estructuras de
datos enlazadas con listas.
A veces una lista enlazada es dinmicamente creada fuera
de un subconjunto propio de nodos semejante a un rbol, y
Son usadas ms eficientemente para recorrer sta serie de
datos.

El siguiente diagrama muestra como funciona la


insercin de un dato en la lista:

El siguiente diagrama muestra como funciona la


eliminacin de un dato en la lista:

La siguiente porcin de cdigo, muestra la creacin de


los nodos de una lista:

public class Lista {


Nodo raiz;
Nodo aux;
public Lista() {
this.raiz = null;
this.aux = null;
}
public void agregaNodo(int valor){
aux = new Nodo(valor,null);
aux.setNext(raiz);
raiz = aux;
System.out.println("AddNodo, Valor: "+valor);
}

La siguiente porcin de cdigo, muestra la creacin de


los nodos de una lista:

public class Lista {


Nodo raiz;
Nodo aux;
public Lista() {
this.raiz = null;
this.aux = null;
}